]> git.sur5r.net Git - freertos/commitdiff
Retarget Softconsole RISC-V demo from IGLOO2 to Renode as it can have more RAM and...
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 24 Dec 2018 17:48:10 +0000 (17:48 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 24 Dec 2018 17:48:10 +0000 (17:48 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2611 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

95 files changed:
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.cproject [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.project [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.settings/language.settings.xml [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/FreeRTOSConfig.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/Packages/.repos.xml [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/Core16550/core16550_regs.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/Core16550/core_16550.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/Core16550/core_16550.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreGPIO/core_gpio.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreGPIO/core_gpio.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreGPIO/coregpio_regs.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_i2c.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_i2c.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_smbus_regs.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreI2C/i2c_interrupt.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreTimer/core_timer.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreTimer/core_timer.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreTimer/coretimer_regs.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/core_uart_apb.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/core_uart_apb.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/coreuartapb_regs.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/cpu_types.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hal.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hal_assert.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hal_irq.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hw_macros.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hw_reg_access.S [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hw_reg_access.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/encoding.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/entry.S [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/init.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-igloo2.ld [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-ram.ld [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal_stubs.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_plic.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/sample_hw_platform.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/syscall.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/RTOSDemo Debug Hardware.launch [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/RTOSDemo Debug Renode.launch [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/RTOSDemo Debug.launch [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/RTOSDemo-start-renode-emulator-and-attach.launch [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/blinky_demo/main_blinky.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/RegTest.S [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/main_full.c [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/hw_platform.h [deleted file]
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/main.c [deleted file]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/.cproject [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/.project [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/.settings/language.settings.xml [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/FreeRTOSConfig.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/Packages/.repos.xml [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/Core16550/core16550_regs.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/Core16550/core_16550.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/Core16550/core_16550.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreGPIO/core_gpio.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreGPIO/core_gpio.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreGPIO/coregpio_regs.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_i2c.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_i2c.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_smbus_regs.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreI2C/i2c_interrupt.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreTimer/core_timer.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreTimer/core_timer.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreTimer/coretimer_regs.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/core_uart_apb.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/core_uart_apb.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/coreuartapb_regs.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/cpu_types.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hal.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hal_assert.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hal_irq.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hw_macros.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hw_reg_access.S [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hw_reg_access.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/encoding.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/entry.S [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/init.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-igloo2.ld [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-ram.ld [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal_stubs.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/riscv_plic.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/sample_hw_platform.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/syscall.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/RTOSDemo Debug Renode.launch [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/RTOSDemo-start-renode-emulator-and-attach.launch [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/blinky_demo/main_blinky.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/full_demo/RegTest.S [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/full_demo/main_full.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/hw_platform.h [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/main.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/microsemi-riscv-renode.ld [new file with mode: 0644]

diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.cproject b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.cproject
deleted file mode 100644 (file)
index fd7ef95..0000000
+++ /dev/null
@@ -1,374 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">\r
-       \r
-    <storageModule moduleId="org.eclipse.cdt.core.settings">\r
-                       \r
-        <cconfiguration id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127">\r
-                               \r
-            <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127" moduleId="org.eclipse.cdt.core.settings" name="Debug">\r
-                                               \r
-                <externalSettings/>\r
-                                               \r
-                <extensions>\r
-                                                       \r
-                    <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>\r
-                                                       \r
-                    <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>\r
-                                                       \r
-                    <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>\r
-                                                       \r
-                    <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>\r
-                                                       \r
-                    <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>\r
-                                                       \r
-                    <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>\r
-                                               \r
-                </extensions>\r
-                                       \r
-            </storageModule>\r
-                               \r
-            <storageModule moduleId="cdtBuildSystem" version="4.0.0">\r
-                                               \r
-                <configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="${cross_rm} -rf" description="" errorParsers="org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GCCErrorParser" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127" name="Debug" parent="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug" postannouncebuildStep="" postbuildStep="" preannouncebuildStep="" prebuildStep="">\r
-                                                       \r
-                    <folderInfo id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127." name="/" resourcePath="">\r
-                                                                       \r
-                        <toolChain errorParsers="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug.1135421195" name="RISC-V Cross GCC" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug">\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.1236561658" name="Create flash image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.197330232" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.306588546" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1940053873" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.none" valueType="enumerated"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.565243439" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength" useByScannerDiscovery="true" value="false" valueType="boolean"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.321222073" name="'char' is signed (-fsigned-char)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar" useByScannerDiscovery="true" value="true" valueType="boolean"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.1177210712" name="Function sections (-ffunction-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections" useByScannerDiscovery="true" value="true" valueType="boolean"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections.1159308156" name="Data sections (-fdata-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections" useByScannerDiscovery="true" value="true" valueType="boolean"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.400131419" name="Debug level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.max" valueType="enumerated"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format.227460743" name="Debug format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format" useByScannerDiscovery="true"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name.39106845" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name" useByScannerDiscovery="false" value="RISC-V GCC/Newlib" valueType="string"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix.975904647" name="Prefix" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix" useByScannerDiscovery="false" value="riscv64-unknown-elf-" valueType="string"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c.629106139" name="C compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c" useByScannerDiscovery="false" value="gcc" valueType="string"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp.700052137" name="C++ compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp" useByScannerDiscovery="false" value="g++" valueType="string"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar.1315168450" name="Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar" useByScannerDiscovery="false" value="ar" valueType="string"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy.729800518" name="Hex/Bin converter" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy" useByScannerDiscovery="false" value="objcopy" valueType="string"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump.1799678707" name="Listing generator" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump" useByScannerDiscovery="false" value="objdump" valueType="string"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size.2116391716" name="Size command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size" useByScannerDiscovery="false" value="size" valueType="string"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make.323254382" name="Build command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make" useByScannerDiscovery="false" value="make" valueType="string"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm.1360582657" name="Remove command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm" useByScannerDiscovery="false" value="rm" valueType="string"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base.1725087349" name="Architecture" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.arch.rv32i" valueType="enumerated"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply.1573871360" name="Multiply extension (RVM)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer.957415439" name="Integer ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.abi.integer.ilp32" valueType="enumerated"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id.959491385" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id" useByScannerDiscovery="false" value="-2032619395" valueType="string"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.freestanding.224053313" name="Assume freestanding environment (-ffreestanding)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.freestanding" useByScannerDiscovery="true" value="false" valueType="boolean"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions.1322946455" name="Do not inline functions (-fno-inline-functions)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions" useByScannerDiscovery="true" value="false" valueType="boolean"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin.1525203912" name="Disable builtin (-fno-builtin)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin" useByScannerDiscovery="true" value="false" valueType="boolean"/>\r
-                                                                               \r
-                            <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform.1851994667" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform"/>\r
-                                                                               \r
-                            <builder buildPath="${workspace_loc:/miv-rv32im-freertos-port-test}/Debug" errorParsers="org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.CWDLocator" id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.1748717066" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.builder"/>\r
-                                                                               \r
-                            <tool command="${cross_prefix}${cross_c}${cross_suffix}" commandLinePattern="${COMMAND} ${cross_toolchain_flags} ${FLAGS} -c ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GCCErrorParser" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.1205277158" name="GNU RISC-V Cross Assembler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler">\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor.1853992692" name="Use preprocessor" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                                               \r
-                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.include.paths.1792818218" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.include.paths" useByScannerDiscovery="true" valueType="includePath">\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/portable/GCC/RISC-V-RV32/CLINT_no_extensions}&quot;"/>\r
-                                                                                               \r
-                                </option>\r
-                                                                                               \r
-                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.defs.2022258301" name="Defined symbols (-D)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.defs" useByScannerDiscovery="true" valueType="definedSymbols">\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="portasmHANDLE_INTERRUPT=handle_m_ext_interrupt"/>\r
-                                                                                               \r
-                                </option>\r
-                                                                                               \r
-                                <inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input.1786331150" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input"/>\r
-                                                                                       \r
-                            </tool>\r
-                                                                               \r
-                            <tool command="${cross_prefix}${cross_c}${cross_suffix}" commandLinePattern="${COMMAND} ${cross_toolchain_flags} ${FLAGS} -c ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GCCErrorParser" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.894708922" name="GNU RISC-V Cross C Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler">\r
-                                                                                               \r
-                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths.1818715770" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths" useByScannerDiscovery="true" valueType="includePath">\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/include}&quot;"/>\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/full_demo/common_demo_tasks/include}&quot;"/>\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/portable/GCC/RISC-V-RV32}&quot;"/>\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}}&quot;"/>\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/drivers/CoreGPIO}&quot;"/>\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/drivers/Core16550}&quot;"/>\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/drivers/CoreUARTapb}&quot;"/>\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/drivers/CoreTimer}&quot;"/>\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/drivers/CoreSPI}&quot;"/>\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/hal}&quot;"/>\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/riscv_hal}&quot;"/>\r
-                                                                                               \r
-                                </option>\r
-                                                                                               \r
-                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.defs.43291576" name="Defined symbols (-D)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.defs" useByScannerDiscovery="true" valueType="definedSymbols">\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="NOT_MSCC_STDIO_THRU_CORE_UART_APB"/>\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="SYS_CLK_FREQ=66000000"/>\r
-                                                                                               \r
-                                </option>\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.std.1915772035" name="Language standard" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.std" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.std.gnu99" valueType="enumerated"/>\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.other.458885637" name="Other compiler flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.other" useByScannerDiscovery="true" value="" valueType="string"/>\r
-                                                                                               \r
-                                <inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.1901773760" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input"/>\r
-                                                                                       \r
-                            </tool>\r
-                                                                               \r
-                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.1713474071" name="GNU RISC-V Cross C++ Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler"/>\r
-                                                                               \r
-                            <tool command="${cross_prefix}${cross_c}${cross_suffix}" commandLinePattern="${COMMAND} ${cross_toolchain_flags} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.209069143" name="GNU RISC-V Cross C Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker">\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections.991946343" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                                               \r
-                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.scriptfile.746597241" name="Script files (-T)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.scriptfile" useByScannerDiscovery="false" valueType="stringList">\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/riscv_hal/microsemi-riscv-ram.ld}&quot;"/>\r
-                                                                                               \r
-                                </option>\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.nostart.1750314954" name="Do not use standard start files (-nostartfiles)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.nostart" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.usenewlibnano.991677097" name="Use newlib-nano (--specs=nano.specs)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.usenewlibnano" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                                               \r
-                                <inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.input.314001493" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.input">\r
-                                                                                                       \r
-                                    <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>\r
-                                                                                                       \r
-                                    <additionalInput kind="additionalinput" paths="$(LIBS)"/>\r
-                                                                                               \r
-                                </inputType>\r
-                                                                                       \r
-                            </tool>\r
-                                                                               \r
-                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.1999185643" name="GNU RISC-V Cross C++ Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker">\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections.1490980679" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections" value="true" valueType="boolean"/>\r
-                                                                                               \r
-                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.scriptfile.1026577013" name="Script files (-T)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.scriptfile" valueType="stringList">\r
-                                                                                                       \r
-                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/riscv_hal/microsemi-riscv-ram.ld}&quot;"/>\r
-                                                                                               \r
-                                </option>\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.nostart.1240127315" name="Do not use standard start files (-nostartfiles)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.nostart" value="true" valueType="boolean"/>\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.usenewlibnano.89628615" name="Use newlib-nano (--specs=nano.specs)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.usenewlibnano" value="true" valueType="boolean"/>\r
-                                                                                       \r
-                            </tool>\r
-                                                                               \r
-                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver.690189418" name="GNU RISC-V Cross Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver"/>\r
-                                                                               \r
-                            <tool command="${cross_prefix}${cross_objcopy}${cross_suffix}" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT}" errorParsers="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash.1183225084" name="GNU RISC-V Cross Create Flash Image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash"/>\r
-                                                                               \r
-                            <tool command="${cross_prefix}${cross_objdump}${cross_suffix}" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT}" errorParsers="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting.876462403" name="GNU RISC-V Cross Create Listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting">\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.source.1650627599" name="Display source (--source|-S)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.source" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.allheaders.1290189840" name="Display all headers (--all-headers|-x)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.allheaders" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.demangle.1153388295" name="Demangle names (--demangle|-C)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.demangle" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.linenumbers.59828896" name="Display line numbers (--line-numbers|-l)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.linenumbers" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.wide.2003727408" name="Wide lines (--wide|-w)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.wide" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
-                                                                                       \r
-                            </tool>\r
-                                                                               \r
-                            <tool command="${cross_prefix}${cross_size}${cross_suffix}" commandLinePattern="${COMMAND} ${FLAGS}" errorParsers="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize.1868273119" name="GNU RISC-V Cross Print Size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize">\r
-                                                                                               \r
-                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.printsize.format.1198877735" name="Size format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.printsize.format" useByScannerDiscovery="false"/>\r
-                                                                                       \r
-                            </tool>\r
-                                                                       \r
-                        </toolChain>\r
-                                                               \r
-                    </folderInfo>\r
-                                                       \r
-                    <folderInfo id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127.2040857254" name="/" resourcePath="FreeRTOS_Source/portable/GCC/RISC-V-RV32">\r
-                                                                       \r
-                        <toolChain id="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug.2044939320" name="RISC-V Cross GCC" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug" unusedChildren="">\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.1236561658.1239322423" name="Create flash image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.1236561658"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.197330232.254070997" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.197330232"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.306588546.1504377467" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.306588546"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1940053873.1559389325" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1940053873"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.565243439.274628285" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.565243439"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.321222073.1499829838" name="'char' is signed (-fsigned-char)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.321222073"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.1177210712.1354219954" name="Function sections (-ffunction-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.1177210712"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections.1159308156.508623359" name="Data sections (-fdata-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections.1159308156"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.400131419.1011963167" name="Debug level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.400131419"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format.227460743.501568040" name="Debug format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format.227460743"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name.39106845.885430790" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name.39106845"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix.975904647.286522576" name="Prefix" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix.975904647"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c.629106139.1315521305" name="C compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c.629106139"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp.700052137.2078541690" name="C++ compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp.700052137"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar.1315168450.1495927611" name="Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar.1315168450"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy.729800518.771460854" name="Hex/Bin converter" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy.729800518"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump.1799678707.330854441" name="Listing generator" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump.1799678707"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size.2116391716.557742668" name="Size command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size.2116391716"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make.323254382.1433263142" name="Build command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make.323254382"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm.1360582657.1493900294" name="Remove command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm.1360582657"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base.1725087349.1145147635" name="Architecture" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base.1725087349"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply.1573871360.1788431761" name="Multiply extension (RVM)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply.1573871360"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer.957415439.1640794537" name="Integer ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer.957415439"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id.959491385.1609971273" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id.959491385"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.freestanding.224053313.61470235" name="Assume freestanding environment (-ffreestanding)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.freestanding.224053313"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions.1322946455.1669507419" name="Do not inline functions (-fno-inline-functions)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions.1322946455"/>\r
-                                                                               \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin.1525203912.1577871892" name="Disable builtin (-fno-builtin)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin.1525203912"/>\r
-                                                                               \r
-                            <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform"/>\r
-                                                                               \r
-                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.1701138834" name="GNU RISC-V Cross Assembler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.1205277158">\r
-                                                                                               \r
-                                <inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input.958497305" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input"/>\r
-                                                                                       \r
-                            </tool>\r
-                                                                               \r
-                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1053378665" name="GNU RISC-V Cross C Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.894708922">\r
-                                                                                               \r
-                                <inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.1855503935" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input"/>\r
-                                                                                       \r
-                            </tool>\r
-                                                                               \r
-                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.1310039856" name="GNU RISC-V Cross C++ Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.1713474071"/>\r
-                                                                               \r
-                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.861501790" name="GNU RISC-V Cross C Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.209069143"/>\r
-                                                                               \r
-                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.892550756" name="GNU RISC-V Cross C++ Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.1999185643"/>\r
-                                                                               \r
-                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver.835675285" name="GNU RISC-V Cross Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver.690189418"/>\r
-                                                                               \r
-                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash.126663148" name="GNU RISC-V Cross Create Flash Image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash.1183225084"/>\r
-                                                                               \r
-                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting.2100288530" name="GNU RISC-V Cross Create Listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting.876462403"/>\r
-                                                                               \r
-                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize.1504637085" name="GNU RISC-V Cross Print Size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize.1868273119"/>\r
-                                                                       \r
-                        </toolChain>\r
-                                                               \r
-                    </folderInfo>\r
-                                                       \r
-                    <sourceEntries>\r
-                                                                       \r
-                        <entry excluding="FreeRTOS/portable/MemMang/heap_5.c|FreeRTOS/portable/MemMang/heap_4.c|FreeRTOS/portable/MemMang/heap_3.c|FreeRTOS/portable/MemMang/heap_1.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>\r
-                                                               \r
-                    </sourceEntries>\r
-                                               \r
-                </configuration>\r
-                                       \r
-            </storageModule>\r
-                               \r
-            <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>\r
-                       \r
-        </cconfiguration>\r
-               \r
-    </storageModule>\r
-       \r
-    <storageModule moduleId="cdtBuildSystem" version="4.0.0">\r
-                       \r
-        <project id="miv-rv32im-freertos-port-test.ilg.gnumcueclipse.managedbuild.cross.riscv.target.elf.1563732131" name="Executable" projectType="ilg.gnumcueclipse.managedbuild.cross.riscv.target.elf"/>\r
-               \r
-    </storageModule>\r
-       \r
-    <storageModule moduleId="scannerConfiguration">\r
-                       \r
-        <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>\r
-                       \r
-        <scannerConfigBuildInfo instanceId="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1785100359;ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1785100359.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1642196096;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.702511061">\r
-                               \r
-            <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>\r
-                       \r
-        </scannerConfigBuildInfo>\r
-                       \r
-        <scannerConfigBuildInfo instanceId="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127;ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.894708922;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.1901773760">\r
-                               \r
-            <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>\r
-                       \r
-        </scannerConfigBuildInfo>\r
-               \r
-    </storageModule>\r
-       \r
-    <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>\r
-       \r
-    <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>\r
-       \r
-    <storageModule moduleId="refreshScope" versionNumber="2">\r
-                       \r
-        <configuration configurationName="Debug">\r
-                               \r
-            <resource resourceType="PROJECT" workspacePath="/RTOSDemo"/>\r
-                       \r
-        </configuration>\r
-               \r
-    </storageModule>\r
-    \r
-</cproject>\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.project b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.project
deleted file mode 100644 (file)
index 0e8872a..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<projectDescription>\r
-       <name>RTOSDemo</name>\r
-       <comment></comment>\r
-       <projects>\r
-       </projects>\r
-       <buildSpec>\r
-               <buildCommand>\r
-                       <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>\r
-                       <triggers>clean,full,incremental,</triggers>\r
-                       <arguments>\r
-                       </arguments>\r
-               </buildCommand>\r
-               <buildCommand>\r
-                       <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>\r
-                       <triggers>full,incremental,</triggers>\r
-                       <arguments>\r
-                       </arguments>\r
-               </buildCommand>\r
-       </buildSpec>\r
-       <natures>\r
-               <nature>org.eclipse.cdt.core.cnature</nature>\r
-               <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>\r
-               <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>\r
-       </natures>\r
-       <linkedResources>\r
-               <link>\r
-                       <name>FreeRTOS_Source</name>\r
-                       <type>2</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Source</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks</name>\r
-                       <type>2</type>\r
-                       <locationURI>virtual:/virtual</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/AbortDelay.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/AbortDelay.c</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/EventGroupsDemo.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/EventGroupsDemo.c</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/GenQTest.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/GenQTest.c</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/MessageBufferDemo.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/MessageBufferDemo.c</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/StreamBufferDemo.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/StreamBufferDemo.c</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/StreamBufferInterrupt.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/StreamBufferInterrupt.c</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/TaskNotify.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/TaskNotify.c</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/TimerDemo.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/TimerDemo.c</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/blocktim.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/blocktim.c</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/countsem.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/countsem.c</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/death.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/death.c</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/dynamic.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/dynamic.c</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/include</name>\r
-                       <type>2</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/include</locationURI>\r
-               </link>\r
-               <link>\r
-                       <name>full_demo/common_demo_tasks/recmutex.c</name>\r
-                       <type>1</type>\r
-                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/recmutex.c</locationURI>\r
-               </link>\r
-       </linkedResources>\r
-       <filteredResources>\r
-               <filter>\r
-                       <id>1529524430510</id>\r
-                       <name>FreeRTOS_Source</name>\r
-                       <type>9</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-include</arguments>\r
-                       </matcher>\r
-               </filter>\r
-               <filter>\r
-                       <id>1529524430514</id>\r
-                       <name>FreeRTOS_Source</name>\r
-                       <type>9</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-portable</arguments>\r
-                       </matcher>\r
-               </filter>\r
-               <filter>\r
-                       <id>1529524430518</id>\r
-                       <name>FreeRTOS_Source</name>\r
-                       <type>5</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-event_groups.c</arguments>\r
-                       </matcher>\r
-               </filter>\r
-               <filter>\r
-                       <id>1529524430521</id>\r
-                       <name>FreeRTOS_Source</name>\r
-                       <type>5</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-list.c</arguments>\r
-                       </matcher>\r
-               </filter>\r
-               <filter>\r
-                       <id>1529524430525</id>\r
-                       <name>FreeRTOS_Source</name>\r
-                       <type>5</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-queue.c</arguments>\r
-                       </matcher>\r
-               </filter>\r
-               <filter>\r
-                       <id>1529524430529</id>\r
-                       <name>FreeRTOS_Source</name>\r
-                       <type>5</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-stream_buffer.c</arguments>\r
-                       </matcher>\r
-               </filter>\r
-               <filter>\r
-                       <id>1529524430533</id>\r
-                       <name>FreeRTOS_Source</name>\r
-                       <type>5</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-tasks.c</arguments>\r
-                       </matcher>\r
-               </filter>\r
-               <filter>\r
-                       <id>1529524430538</id>\r
-                       <name>FreeRTOS_Source</name>\r
-                       <type>5</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-timers.c</arguments>\r
-                       </matcher>\r
-               </filter>\r
-               <filter>\r
-                       <id>1531000165521</id>\r
-                       <name>FreeRTOS_Source/portable</name>\r
-                       <type>9</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-GCC</arguments>\r
-                       </matcher>\r
-               </filter>\r
-               <filter>\r
-                       <id>1531000165526</id>\r
-                       <name>FreeRTOS_Source/portable</name>\r
-                       <type>9</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-MemMang</arguments>\r
-                       </matcher>\r
-               </filter>\r
-               <filter>\r
-                       <id>1531000203197</id>\r
-                       <name>FreeRTOS_Source/portable/GCC</name>\r
-                       <type>9</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-RISC-V-RV32</arguments>\r
-                       </matcher>\r
-               </filter>\r
-               <filter>\r
-                       <id>1529524494421</id>\r
-                       <name>FreeRTOS_Source/portable/MemMang</name>\r
-                       <type>5</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-heap_4.c</arguments>\r
-                       </matcher>\r
-               </filter>\r
-               <filter>\r
-                       <id>1545005412575</id>\r
-                       <name>FreeRTOS_Source/portable/GCC/RISC-V-RV32</name>\r
-                       <type>9</type>\r
-                       <matcher>\r
-                               <id>org.eclipse.ui.ide.multiFilter</id>\r
-                               <arguments>1.0-name-matches-false-false-CLINT_no_extensions</arguments>\r
-                       </matcher>\r
-               </filter>\r
-       </filteredResources>\r
-       <variableList>\r
-               <variable>\r
-                       <name>FREERTOS_ROOT</name>\r
-                       <value>$%7BPARENT-3-PROJECT_LOC%7D</value>\r
-               </variable>\r
-               <variable>\r
-                       <name>copy_PARENT</name>\r
-                       <value>$%7BPARENT-4-PROJECT_LOC%7D/FreeRTOS/WorkingCopy/FreeRTOS</value>\r
-               </variable>\r
-       </variableList>\r
-</projectDescription>\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.settings/language.settings.xml b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.settings/language.settings.xml
deleted file mode 100644 (file)
index f0af7e9..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<project>\r
-       \r
-    <configuration id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127" name="Debug">\r
-                       \r
-        <extension point="org.eclipse.cdt.core.LanguageSettingsProvider">\r
-                               \r
-            <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>\r
-                               \r
-            <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>\r
-                               \r
-            <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>\r
-                               \r
-            <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="1803830185129867376" id="ilg.gnumcueclipse.managedbuild.cross.riscv.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT RISC-V Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">\r
-                                               \r
-                <language-scope id="org.eclipse.cdt.core.gcc"/>\r
-                                               \r
-                <language-scope id="org.eclipse.cdt.core.g++"/>\r
-                                       \r
-            </provider>\r
-                       \r
-        </extension>\r
-               \r
-    </configuration>\r
-    \r
-</project>\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/FreeRTOSConfig.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/FreeRTOSConfig.h
deleted file mode 100644 (file)
index 08df67e..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-/*\r
-    FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd.\r
-    All rights reserved\r
-\r
-    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
-\r
-    This file is part of the FreeRTOS distribution.\r
-\r
-    FreeRTOS is free software; you can redistribute it and/or modify it under\r
-    the terms of the GNU General Public License (version 2) as published by the\r
-    Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.\r
-\r
-    ***************************************************************************\r
-    >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
-    >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
-    >>!   obliged to provide the source code for proprietary components     !<<\r
-    >>!   outside of the FreeRTOS kernel.                                   !<<\r
-    ***************************************************************************\r
-\r
-    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
-    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
-    FOR A PARTICULAR PURPOSE.  Full license text is available on the following\r
-    link: http://www.freertos.org/a00114.html\r
-\r
-    ***************************************************************************\r
-     *                                                                       *\r
-     *    FreeRTOS provides completely free yet professionally developed,    *\r
-     *    robust, strictly quality controlled, supported, and cross          *\r
-     *    platform software that is more than just the market leader, it     *\r
-     *    is the industry's de facto standard.                               *\r
-     *                                                                       *\r
-     *    Help yourself get started quickly while simultaneously helping     *\r
-     *    to support the FreeRTOS project by purchasing a FreeRTOS           *\r
-     *    tutorial book, reference manual, or both:                          *\r
-     *    http://www.FreeRTOS.org/Documentation                              *\r
-     *                                                                       *\r
-    ***************************************************************************\r
-\r
-    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading\r
-    the FAQ page "My application does not run, what could be wrong?".  Have you\r
-    defined configASSERT()?\r
-\r
-    http://www.FreeRTOS.org/support - In return for receiving this top quality\r
-    embedded software for free we request you assist our global community by\r
-    participating in the support forum.\r
-\r
-    http://www.FreeRTOS.org/training - Investing in training allows your team to\r
-    be as productive as possible as early as possible.  Now you can receive\r
-    FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers\r
-    Ltd, and the world's leading authority on the world's leading RTOS.\r
-\r
-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
-    including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
-    compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
-\r
-    http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.\r
-    Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.\r
-\r
-    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High\r
-    Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
-    licenses offer ticketed support, indemnification and commercial middleware.\r
-\r
-    http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
-    engineered and independently SIL3 certified version for use in safety and\r
-    mission critical applications that require provable dependability.\r
-\r
-    1 tab == 4 spaces!\r
-*/\r
-\r
-\r
-#ifndef FREERTOS_CONFIG_H\r
-#define FREERTOS_CONFIG_H\r
-\r
-#include "hw_platform.h"\r
-#include "riscv_plic.h"\r
-\r
-/*-----------------------------------------------------------\r
- * Application specific definitions.\r
- *\r
- * These definitions should be adjusted for your particular hardware and\r
- * application requirements.\r
- *\r
- * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\r
- * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\r
- *\r
- * See http://www.freertos.org/a00110.html.\r
- *----------------------------------------------------------*/\r
-\r
-#define configCLINT_BASE_ADDRESS               PRCI_BASE\r
-#define configUSE_PREEMPTION                   1\r
-#define configUSE_IDLE_HOOK                            1\r
-#define configUSE_TICK_HOOK                            1\r
-//#define configCPU_CLOCK_HZ                           ( ( unsigned long ) ( SYS_CLK_FREQ ) )\r
-#define configCPU_CLOCK_HZ                             ( ( unsigned long ) ( SYS_CLK_FREQ / 100 ) ) /*_RB_ Seems to be a factor of 100 between machine timer frequency and CPU frequency. */\r
-#define configTICK_RATE_HZ                             ( ( TickType_t ) 1000 )\r
-#define configMAX_PRIORITIES                   ( 5 )\r
-#define configMINIMAL_STACK_SIZE               ( ( unsigned short ) 150 ) /* Can be as low as 60 but some of the demo tasks that use this constant require it to be higher. */\r
-#define configTOTAL_HEAP_SIZE                  ( ( size_t ) ( 280 * 1024 ) )\r
-#define configMAX_TASK_NAME_LEN                        ( 16 )\r
-#define configUSE_TRACE_FACILITY               0\r
-#define configUSE_16_BIT_TICKS                 0\r
-#define configIDLE_SHOULD_YIELD                        0\r
-#define configUSE_MUTEXES                              1\r
-#define configQUEUE_REGISTRY_SIZE              8\r
-#define configCHECK_FOR_STACK_OVERFLOW 2\r
-#define configUSE_RECURSIVE_MUTEXES            1\r
-#define configUSE_MALLOC_FAILED_HOOK   1\r
-#define configUSE_APPLICATION_TASK_TAG 0\r
-#define configUSE_COUNTING_SEMAPHORES  1\r
-#define configGENERATE_RUN_TIME_STATS  0\r
-\r
-/* Co-routine definitions. */\r
-#define configUSE_CO_ROUTINES                  0\r
-#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )\r
-\r
-/* Software timer definitions. */\r
-#define configUSE_TIMERS                               1\r
-#define configTIMER_TASK_PRIORITY              ( configMAX_PRIORITIES - 1 )\r
-#define configTIMER_QUEUE_LENGTH               4\r
-#define configTIMER_TASK_STACK_DEPTH   ( configMINIMAL_STACK_SIZE )\r
-\r
-/* Task priorities.  Allow these to be overridden. */\r
-#ifndef uartPRIMARY_PRIORITY\r
-       #define uartPRIMARY_PRIORITY            ( configMAX_PRIORITIES - 3 )\r
-#endif\r
-\r
-/* Set the following definitions to 1 to include the API function, or zero\r
-to exclude the API function. */\r
-#define INCLUDE_vTaskPrioritySet                       1\r
-#define INCLUDE_uxTaskPriorityGet                      1\r
-#define INCLUDE_vTaskDelete                                    1\r
-#define INCLUDE_vTaskCleanUpResources          1\r
-#define INCLUDE_vTaskSuspend                           1\r
-#define INCLUDE_vTaskDelayUntil                                1\r
-#define INCLUDE_vTaskDelay                                     1\r
-#define INCLUDE_eTaskGetState                          1\r
-#define INCLUDE_xTimerPendFunctionCall         1\r
-#define INCLUDE_xTaskAbortDelay                                1\r
-#define INCLUDE_xTaskGetHandle                         1\r
-#define INCLUDE_xSemaphoreGetMutexHolder       1\r
-\r
-/* Normal assert() semantics without relying on the provision of an assert.h\r
-header file. */\r
-#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); __asm volatile( "ebreak" ); for( ;; ); }\r
-\r
-#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\r
-\r
-\r
-#endif /* FREERTOS_CONFIG_H */\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/Packages/.repos.xml b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/Packages/.repos.xml
deleted file mode 100644 (file)
index 76dbb89..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<repositories>\r
-  <repository>\r
-    <type>CMSIS Pack</type>\r
-    <name>Keil</name>\r
-    <url>http://www.keil.com/pack/index.pidx</url>\r
-  </repository>\r
-</repositories>\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/Core16550/core16550_regs.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/Core16550/core16550_regs.h
deleted file mode 100644 (file)
index 0b921ce..0000000
+++ /dev/null
@@ -1,582 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2007-2015 Microsemi SoC Products Group. All rights reserved.\r
- *\r
- * IP core registers definitions. This file contains the definitions required\r
- * for accessing the IP core through the hardware abstraction layer (HAL).\r
- * This file was automatically generated, using "get_header.exe" version 0.4.0,\r
- * from the IP-XACT description for:\r
- *\r
- *             Core16550    version: 2.0.0\r
- *\r
- * SVN $Revision: 7963 $\r
- * SVN $Date: 2015-10-09 17:58:21 +0530 (Fri, 09 Oct 2015) $\r
- *\r
- *******************************************************************************/\r
-#ifndef CORE_16550_REGISTERS_H_\r
-#define CORE_16550_REGISTERS_H_ 1\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-/*******************************************************************************\r
- * RBR register:\r
- *------------------------------------------------------------------------------\r
- * Receive Buffer Register\r
- */\r
-#define RBR_REG_OFFSET 0x00U\r
-\r
-/*******************************************************************************\r
- * THR register:\r
- *------------------------------------------------------------------------------\r
- * Transmit Holding Register\r
- */\r
-#define THR_REG_OFFSET 0x00U\r
-\r
-/*******************************************************************************\r
- * DLR register:\r
- *------------------------------------------------------------------------------\r
- * Divisor Latch(LSB) Register\r
- */\r
-#define DLR_REG_OFFSET 0x00U\r
-\r
-/*******************************************************************************\r
- * DMR register:\r
- *------------------------------------------------------------------------------\r
- * Divisor Latch(MSB) Register\r
- */\r
-#define DMR_REG_OFFSET 0x04U\r
-\r
-/*******************************************************************************\r
- * IER register:\r
- *------------------------------------------------------------------------------\r
- * Interrupt Enable Register\r
- */\r
-#define IER_REG_OFFSET 0x04U\r
-\r
-/*------------------------------------------------------------------------------\r
- * IER_ERBFI:\r
- *   ERBFI field of register IER.\r
- *------------------------------------------------------------------------------\r
- * Enables Received Data Available Interrupt. 0 - Disabled; 1 - Enabled\r
- */\r
-#define IER_ERBFI_OFFSET   0x04U\r
-#define IER_ERBFI_MASK     0x01U\r
-#define IER_ERBFI_SHIFT    0U\r
-\r
-/*------------------------------------------------------------------------------\r
- * IER_ETBEI:\r
- *   ETBEI field of register IER.\r
- *------------------------------------------------------------------------------\r
- * Enables the Transmitter Holding Register Empty Interrupt. 0 - Disabled; 1 - \r
- * Enabled\r
- */\r
-#define IER_ETBEI_OFFSET   0x04U\r
-#define IER_ETBEI_MASK     0x02U\r
-#define IER_ETBEI_SHIFT    1U\r
-\r
-/*------------------------------------------------------------------------------\r
- * IER_ELSI:\r
- *   ELSI field of register IER.\r
- *------------------------------------------------------------------------------\r
- * Enables the Receiver Line Status Interrupt. 0 - Disabled; 1 - Enabled\r
- */\r
-#define IER_ELSI_OFFSET   0x04U\r
-#define IER_ELSI_MASK     0x04U\r
-#define IER_ELSI_SHIFT    2U\r
-\r
-/*------------------------------------------------------------------------------\r
- * IER_EDSSI:\r
- *   EDSSI field of register IER.\r
- *------------------------------------------------------------------------------\r
- *  Enables the Modem Status Interrupt 0 - Disabled; 1 - Enabled\r
- */\r
-#define IER_EDSSI_OFFSET   0x04U\r
-#define IER_EDSSI_MASK     0x08U\r
-#define IER_EDSSI_SHIFT    3U\r
-\r
-/*******************************************************************************\r
- * IIR register:\r
- *------------------------------------------------------------------------------\r
- * Interrupt Identification\r
- */\r
-#define IIR_REG_OFFSET 0x08U\r
-\r
-/*------------------------------------------------------------------------------\r
- * IIR_IIR:\r
- *   IIR field of register IIR.\r
- *------------------------------------------------------------------------------\r
- * Interrupt Identification bits.\r
- */\r
-#define IIR_IIR_OFFSET   0x08U\r
-#define IIR_IIR_MASK     0x0FU\r
-#define IIR_IIR_SHIFT    0U\r
-\r
-/*------------------------------------------------------------------------------\r
- * IIR_IIR:\r
- *   IIR field of register IIR.\r
- *------------------------------------------------------------------------------\r
- * Interrupt Identification bits.\r
- */\r
-\r
-/*------------------------------------------------------------------------------\r
- * IIR_Mode:\r
- *   Mode field of register IIR.\r
- *------------------------------------------------------------------------------\r
- * 11 - FIFO mode\r
- */\r
-#define IIR_MODE_OFFSET   0x08U\r
-#define IIR_MODE_MASK     0xC0U\r
-#define IIR_MODE_SHIFT    6U\r
-\r
-/*******************************************************************************\r
- * FCR register:\r
- *------------------------------------------------------------------------------\r
- * FIFO Control Register\r
- */\r
-#define FCR_REG_OFFSET 0x08\r
-\r
-/*------------------------------------------------------------------------------\r
- * FCR_Bit0:\r
- *   Bit0 field of register FCR.\r
- *------------------------------------------------------------------------------\r
- * This bit enables both the TX and RX FIFOs.\r
- */\r
-#define FCR_BIT0_OFFSET   0x08U\r
-#define FCR_BIT0_MASK     0x01U\r
-#define FCR_BIT0_SHIFT    0U\r
-\r
-#define FCR_ENABLE_OFFSET   0x08U\r
-#define FCR_ENABLE_MASK     0x01U\r
-#define FCR_ENABLE_SHIFT    0U\r
-\r
-/*------------------------------------------------------------------------------\r
- * FCR_Bit1:\r
- *   Bit1 field of register FCR.\r
- *------------------------------------------------------------------------------\r
- * Clears all bytes in the RX FIFO and resets its counter logic. The shift \r
- * register is not cleared.  0 - Disabled; 1 - Enabled\r
- */\r
-#define FCR_BIT1_OFFSET   0x08U\r
-#define FCR_BIT1_MASK     0x02U\r
-#define FCR_BIT1_SHIFT    1U\r
-\r
-#define FCR_CLEAR_RX_OFFSET   0x08U\r
-#define FCR_CLEAR_RX_MASK     0x02U\r
-#define FCR_CLEAR_RX_SHIFT    1U\r
-\r
-/*------------------------------------------------------------------------------\r
- * FCR_Bit2:\r
- *   Bit2 field of register FCR.\r
- *------------------------------------------------------------------------------\r
- * Clears all bytes in the TX FIFO and resets its counter logic. The shift \r
- * register is not cleared.  0 - Disabled; 1 - Enabled\r
- */\r
-#define FCR_BIT2_OFFSET   0x08U\r
-#define FCR_BIT2_MASK     0x04U\r
-#define FCR_BIT2_SHIFT    2U\r
-\r
-#define FCR_CLEAR_TX_OFFSET   0x08U\r
-#define FCR_CLEAR_TX_MASK     0x04U\r
-#define FCR_CLEAR_TX_SHIFT    2U\r
-\r
-/*------------------------------------------------------------------------------\r
- * FCR_Bit3:\r
- *   Bit3 field of register FCR.\r
- *------------------------------------------------------------------------------\r
- * Enables RXRDYN and TXRDYN pins when set to 1. Otherwise, they are disabled.\r
- */\r
-#define FCR_BIT3_OFFSET   0x08U\r
-#define FCR_BIT3_MASK     0x08U\r
-#define FCR_BIT3_SHIFT    3U\r
-\r
-#define FCR_RDYN_EN_OFFSET   0x08U\r
-#define FCR_RDYN_EN_MASK     0x08U\r
-#define FCR_RDYN_EN_SHIFT    3U\r
-\r
-/*------------------------------------------------------------------------------\r
- * FCR_Bit6:\r
- *   Bit6 field of register FCR.\r
- *------------------------------------------------------------------------------\r
- * These bits are used to set the trigger level for the RX FIFO interrupt. RX \r
- * FIFO Trigger Level: 0 - 1; 1 - 4; 2 - 8; 3 - 14\r
- */\r
-#define FCR_BIT6_OFFSET   0x08U\r
-#define FCR_BIT6_MASK     0xC0U\r
-#define FCR_BIT6_SHIFT    6U\r
-\r
-#define FCR_TRIG_LEVEL_OFFSET   0x08U\r
-#define FCR_TRIG_LEVEL_MASK     0xC0U\r
-#define FCR_TRIG_LEVEL_SHIFT    6U\r
-\r
-/*******************************************************************************\r
- * LCR register:\r
- *------------------------------------------------------------------------------\r
- * Line Control Register\r
- */\r
-#define LCR_REG_OFFSET 0x0CU\r
-\r
-/*------------------------------------------------------------------------------\r
- * LCR_WLS:\r
- *   WLS field of register LCR.\r
- *------------------------------------------------------------------------------\r
- * Word Length Select: 00 - 5 bits; 01 - 6 bits; 10 - 7 bits; 11 - 8 bits\r
- */\r
-#define LCR_WLS_OFFSET   0x0CU\r
-#define LCR_WLS_MASK     0x03U\r
-#define LCR_WLS_SHIFT    0U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LCR_STB:\r
- *   STB field of register LCR.\r
- *------------------------------------------------------------------------------\r
- * Number of Stop Bits: 0 - 1 stop bit; 1 - 1½ stop bits when WLS = 00, 2 stop \r
- * bits in other cases\r
- */\r
-#define LCR_STB_OFFSET   0x0CU\r
-#define LCR_STB_MASK     0x04U\r
-#define LCR_STB_SHIFT    2U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LCR_PEN:\r
- *   PEN field of register LCR.\r
- *------------------------------------------------------------------------------\r
- * Parity Enable 0 - Disabled; 1 - Enabled. Parity is added in transmission and \r
- * checked in receiving.\r
- */\r
-#define LCR_PEN_OFFSET   0x0CU\r
-#define LCR_PEN_MASK     0x08U\r
-#define LCR_PEN_SHIFT    3U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LCR_EPS:\r
- *   EPS field of register LCR.\r
- *------------------------------------------------------------------------------\r
- * Even Parity Select 0 - Odd parity; 1 - Even parity\r
- */\r
-#define LCR_EPS_OFFSET   0x0CU\r
-#define LCR_EPS_MASK     0x10U\r
-#define LCR_EPS_SHIFT    4U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LCR_SP:\r
- *   SP field of register LCR.\r
- *------------------------------------------------------------------------------\r
- * Stick Parity 0 - Disabled; 1 - Enabled When stick parity is enabled, it \r
- * works as follows: Bits 4..3, 11 - 0 will be sent as a parity bit, and \r
- * checked in receiving.  01 - 1 will be sent as a parity bit, and checked in \r
- * receiving.\r
- */\r
-#define LCR_SP_OFFSET   0x0CU\r
-#define LCR_SP_MASK     0x20U\r
-#define LCR_SP_SHIFT    5U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LCR_SB:\r
- *   SB field of register LCR.\r
- *------------------------------------------------------------------------------\r
- * Set Break 0 - Disabled 1 - Set break. SOUT is forced to 0. This does not \r
- * have any effect on transmitter logic. The break is disabled by setting the \r
- * bit to 0.\r
- */\r
-#define LCR_SB_OFFSET   0x0CU\r
-#define LCR_SB_MASK     0x40U\r
-#define LCR_SB_SHIFT    6U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LCR_DLAB:\r
- *   DLAB field of register LCR.\r
- *------------------------------------------------------------------------------\r
- * Divisor Latch Access Bit 0 - Disabled. Normal addressing mode in use 1 - \r
- * Enabled. Enables access to the Divisor Latch registers during read or write \r
- * operation to addresses 0 and 1.\r
- */\r
-#define LCR_DLAB_OFFSET   0x0CU\r
-#define LCR_DLAB_MASK     0x80U\r
-#define LCR_DLAB_SHIFT    7U\r
-\r
-/*******************************************************************************\r
- * MCR register:\r
- *------------------------------------------------------------------------------\r
- * Modem Control Register\r
- */\r
-#define MCR_REG_OFFSET 0x10U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MCR_DTR:\r
- *   DTR field of register MCR.\r
- *------------------------------------------------------------------------------\r
- * Controls the Data Terminal Ready (DTRn) output.  0 - DTRn <= 1; 1 - DTRn <= 0\r
- */\r
-#define MCR_DTR_OFFSET   0x10U\r
-#define MCR_DTR_MASK     0x01U\r
-#define MCR_DTR_SHIFT    0U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MCR_RTS:\r
- *   RTS field of register MCR.\r
- *------------------------------------------------------------------------------\r
- * Controls the Request to Send (RTSn) output.  0 - RTSn <= 1; 1 - RTSn <= 0\r
- */\r
-#define MCR_RTS_OFFSET   0x10U\r
-#define MCR_RTS_MASK     0x02U\r
-#define MCR_RTS_SHIFT    1U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MCR_Out1:\r
- *   Out1 field of register MCR.\r
- *------------------------------------------------------------------------------\r
- * Controls the Output1 (OUT1n) signal.  0 - OUT1n <= 1; 1 - OUT1n <= 0\r
- */\r
-#define MCR_OUT1_OFFSET   0x10U\r
-#define MCR_OUT1_MASK     0x04U\r
-#define MCR_OUT1_SHIFT    2U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MCR_Out2:\r
- *   Out2 field of register MCR.\r
- *------------------------------------------------------------------------------\r
- * Controls the Output2 (OUT2n) signal.  0 - OUT2n <=1; 1 - OUT2n <=0\r
- */\r
-#define MCR_OUT2_OFFSET   0x10U\r
-#define MCR_OUT2_MASK     0x08U\r
-#define MCR_OUT2_SHIFT    3U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MCR_Loop:\r
- *   Loop field of register MCR.\r
- *------------------------------------------------------------------------------\r
- * Loop enable bit 0 - Disabled; 1 - Enabled. The following happens in loop \r
- * mode: SOUT is set to 1. The SIN, DSRn, CTSn, RIn, and DCDn inputs are \r
- * disconnected.  The output of the Transmitter Shift Register is looped back \r
- * into the Receiver Shift Register. The modem control outputs (DTRn, RTSn, \r
- * OUT1n, and OUT2n) are connected internally to the modem control inputs, and \r
- * the modem control output pins are set at 1. In loopback mode, the \r
- * transmitted data is immediately received, allowing the CPU to check the \r
- * operation of the UART. The interrupts are operating in loop mode.\r
- */\r
-#define MCR_LOOP_OFFSET   0x10U\r
-#define MCR_LOOP_MASK     0x10U\r
-#define MCR_LOOP_SHIFT    4U\r
-\r
-/*******************************************************************************\r
- * LSR register:\r
- *------------------------------------------------------------------------------\r
- * Line Status Register\r
- */\r
-#define LSR_REG_OFFSET 0x14U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LSR_DR:\r
- *   DR field of register LSR.\r
- *------------------------------------------------------------------------------\r
- * Data Ready indicator 1 when a data byte has been received and stored in the \r
- * FIFO. DR is cleared to 0 when the CPU reads the data from the FIFO.\r
- */\r
-#define LSR_DR_OFFSET   0x14U\r
-#define LSR_DR_MASK     0x01U\r
-#define LSR_DR_SHIFT    0U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LSR_OE:\r
- *   OE field of register LSR.\r
- *------------------------------------------------------------------------------\r
- * Overrun Error indicator Indicates that the new byte was received before the \r
- * CPU read the byte from the receive buffer, and that the earlier data byte \r
- * was destroyed. OE is cleared when the CPU reads the Line Status Register. If \r
- * the data continues to fill the FIFO beyond the trigger level, an overrun \r
- * error will occur once the FIFO is full and the next character has been \r
- * completely received in the shift register. The character in the shift \r
- * register is overwritten, but it is not transferred to the FIFO.\r
- */\r
-#define LSR_OE_OFFSET   0x14U\r
-#define LSR_OE_MASK     0x02U\r
-#define LSR_OE_SHIFT    1U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LSR_PE:\r
- *   PE field of register LSR.\r
- *------------------------------------------------------------------------------\r
- * Parity Error indicator Indicates that the received byte had a parity error. \r
- * PE is cleared when the CPU reads the Line Status Register. This error is \r
- * revealed to the CPU when its associated character is at the top of the FIFO.\r
- */\r
-#define LSR_PE_OFFSET   0x14U\r
-#define LSR_PE_MASK     0x04U\r
-#define LSR_PE_SHIFT    2U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LSR_FE:\r
- *   FE field of register LSR.\r
- *------------------------------------------------------------------------------\r
- *  Framing Error indicator Indicates that the received byte did not have a \r
- * valid Stop bit. FE is cleared when the CPU reads the Line Status Register. \r
- * The UART will try to re-synchronize after a framing error. To do this, it\r
- * assumes that the framing error was due to the next start bit, so it samples \r
- * this start bit twice, and then starts receiving the data.  This error is \r
- * revealed to the CPU when its associated character is at the top of the FIFO.\r
- */\r
-#define LSR_FE_OFFSET   0x14U\r
-#define LSR_FE_MASK     0x08U\r
-#define LSR_FE_SHIFT    3U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LSR_BI:\r
- *   BI field of register LSR.\r
- *------------------------------------------------------------------------------\r
- * Break Interrupt indicator Indicates that the received data is at 0 longer \r
- * than a full word transmission time (start bit + data bits + parity + stop \r
- * bits). BI is cleared when the CPU reads the Line Status Register. This error \r
- * is revealed to the CPU when its associated character is at the top of the \r
- * FIFO. When break occurs, only one zero character is loaded into the FIFO.\r
- */\r
-#define LSR_BI_OFFSET   0x14U\r
-#define LSR_BI_MASK     0x10U\r
-#define LSR_BI_SHIFT    4U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LSR_THRE:\r
- *   THRE field of register LSR.\r
- *------------------------------------------------------------------------------\r
- *  Transmitter Holding Register Empty indicator Indicates that the UART is \r
- * ready to transmit a new data byte. THRE causes an interrupt to the CPU when \r
- * bit 1 (ETBEI) in the Interrupt Enable Register is 1.  This bit is set when \r
- * the TX FIFO is empty. It is cleared when at least one byte is written to the \r
- * TX FIFO.\r
- */\r
-#define LSR_THRE_OFFSET   0x14U\r
-#define LSR_THRE_MASK     0x20U\r
-#define LSR_THRE_SHIFT    5U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LSR_TEMT:\r
- *   TEMT field of register LSR.\r
- *------------------------------------------------------------------------------\r
- *  Transmitter Empty indicator This bit is set to 1 when both the transmitter \r
- * FIFO and shift registers are empty.\r
- */\r
-#define LSR_TEMT_OFFSET   0x14U\r
-#define LSR_TEMT_MASK     0x40U\r
-#define LSR_TEMT_SHIFT    6U\r
-\r
-/*------------------------------------------------------------------------------\r
- * LSR_FIER:\r
- *   FIER field of register LSR.\r
- *------------------------------------------------------------------------------\r
- *  This bit is set when there is at least one parity error, framing error, or \r
- * break indication in the FIFO. FIER is cleared when the CPU reads the LSR if \r
- * there are no subsequent errors in the FIFO.\r
- */\r
-#define LSR_FIER_OFFSET   0x14U\r
-#define LSR_FIER_MASK     0x80U\r
-#define LSR_FIER_SHIFT    7U\r
-\r
-/*******************************************************************************\r
- * MSR register:\r
- *------------------------------------------------------------------------------\r
- * Modem Status Register\r
- */\r
-#define MSR_REG_OFFSET 0x18U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MSR_DCTS:\r
- *   DCTS field of register MSR.\r
- *------------------------------------------------------------------------------\r
- * Delta Clear to Send indicator.  Indicates that the CTSn input has changed \r
- * state since the last time it was read by the CPU.\r
- */\r
-#define MSR_DCTS_OFFSET   0x18U\r
-#define MSR_DCTS_MASK     0x01U\r
-#define MSR_DCTS_SHIFT    0U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MSR_DDSR:\r
- *   DDSR field of register MSR.\r
- *------------------------------------------------------------------------------\r
- * Delta Data Set Ready indicator Indicates that the DSRn input has changed \r
- * state since the last time it was read by the CPU.\r
- */\r
-#define MSR_DDSR_OFFSET   0x18U\r
-#define MSR_DDSR_MASK     0x02U\r
-#define MSR_DDSR_SHIFT    1U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MSR_TERI:\r
- *   TERI field of register MSR.\r
- *------------------------------------------------------------------------------\r
- * Trailing Edge of Ring Indicator detector. Indicates that RI input has \r
- * changed from 0 to 1.\r
- */\r
-#define MSR_TERI_OFFSET   0x18U\r
-#define MSR_TERI_MASK     0x04U\r
-#define MSR_TERI_SHIFT    2U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MSR_DDCD:\r
- *   DDCD field of register MSR.\r
- *------------------------------------------------------------------------------\r
- * Delta Data Carrier Detect indicator Indicates that DCD input has changed \r
- * state.  NOTE: Whenever bit 0, 1, 2, or 3 is set to 1, a Modem Status \r
- * Interrupt is generated.\r
- */\r
-#define MSR_DDCD_OFFSET   0x18U\r
-#define MSR_DDCD_MASK     0x08U\r
-#define MSR_DDCD_SHIFT    3U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MSR_CTS:\r
- *   CTS field of register MSR.\r
- *------------------------------------------------------------------------------\r
- * Clear to Send The complement of the CTSn input. When bit 4 of the Modem \r
- * Control Register (MCR) is set to 1 (loop), this bit is equivalent to DTR in \r
- * the MCR.\r
- */\r
-#define MSR_CTS_OFFSET   0x18U\r
-#define MSR_CTS_MASK     0x10U\r
-#define MSR_CTS_SHIFT    4U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MSR_DSR:\r
- *   DSR field of register MSR.\r
- *------------------------------------------------------------------------------\r
- * Data Set Ready The complement of the DSR input. When bit 4 of the MCR is set \r
- * to 1 (loop), this bit is equivalent to RTSn in the MCR.\r
- */\r
-#define MSR_DSR_OFFSET   0x18U\r
-#define MSR_DSR_MASK     0x20U\r
-#define MSR_DSR_SHIFT    5U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MSR_RI:\r
- *   RI field of register MSR.\r
- *------------------------------------------------------------------------------\r
- * Ring Indicator The complement of the RIn input. When bit 4 of the MCR is set \r
- * to 1 (loop), this bit is equivalent to OUT1 in the MCR.\r
- */\r
-#define MSR_RI_OFFSET   0x18U\r
-#define MSR_RI_MASK     0x40U\r
-#define MSR_RI_SHIFT    6U\r
-\r
-/*------------------------------------------------------------------------------\r
- * MSR_DCD:\r
- *   DCD field of register MSR.\r
- *------------------------------------------------------------------------------\r
- * Data Carrier Detect The complement of DCDn input. When bit 4 of the MCR is \r
- * set to 1 (loop), this bit is equivalent to OUT2 in the MCR.\r
- */\r
-#define MSR_DCD_OFFSET   0x18U\r
-#define MSR_DCD_MASK     0x80U\r
-#define MSR_DCD_SHIFT    7U\r
-\r
-/*******************************************************************************\r
- * SR register:\r
- *------------------------------------------------------------------------------\r
- * Scratch Register\r
- */\r
-#define SR_REG_OFFSET  0x1CU\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif /* CORE_16550_REGISTERS_H_*/\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/Core16550/core_16550.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/Core16550/core_16550.c
deleted file mode 100644 (file)
index ca735e6..0000000
+++ /dev/null
@@ -1,865 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2007-2015 Microsemi SoC Products Group. All rights reserved.\r
- *\r
- * Core16550 driver implementation. See file "core_16550.h" for a\r
- * description of the functions implemented in this file.\r
- *\r
- * SVN $Revision: 7963 $\r
- * SVN $Date: 2015-10-09 17:58:21 +0530 (Fri, 09 Oct 2015) $\r
- */\r
-#include "hal.h"\r
-#include "core_16550.h"\r
-#include "core16550_regs.h"\r
-#include "hal_assert.h"\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-/*******************************************************************************\r
- * Definitions for transmitter states\r
- */\r
-#define TX_COMPLETE     0x00U\r
-\r
-/*******************************************************************************\r
- * Definition for transmitter FIFO size\r
- */\r
-#define TX_FIFO_SIZE    16U\r
-\r
-/*******************************************************************************\r
- * Default receive interrupt trigger level\r
- */\r
-#define DEFAULT_RX_TRIG_LEVEL  ((uint8_t)UART_16550_FIFO_SINGLE_BYTE)\r
-\r
-/*******************************************************************************\r
- * Receiver error status mask and shift offset\r
- */\r
-#define STATUS_ERROR_MASK   ( LSR_OE_MASK | LSR_PE_MASK |  \\r
-                              LSR_FE_MASK | LSR_BI_MASK | LSR_FIER_MASK)\r
-\r
-/*******************************************************************************\r
- * Definitions for invalid parameters with proper type\r
- */\r
-#define INVALID_INTERRUPT   0U\r
-#define INVALID_IRQ_HANDLER ( (uart_16550_irq_handler_t) 0 )\r
-\r
-/*******************************************************************************\r
- * Possible values for Interrupt Identification Register Field.\r
- */\r
-#define IIRF_MODEM_STATUS       0x00U\r
-#define IIRF_THRE               0x02U\r
-#define IIRF_RX_DATA            0x04U\r
-#define IIRF_RX_LINE_STATUS     0x06U\r
-#define IIRF_DATA_TIMEOUT       0x0CU\r
-\r
-/*******************************************************************************\r
- * Null parameters with appropriate type definitions\r
- */\r
-#define NULL_ADDR       ( ( addr_t ) 0 )\r
-#define NULL_INSTANCE   ( ( uart_16550_instance_t * ) 0 )\r
-#define NULL_BUFF       ( ( uint8_t * ) 0 )\r
-\r
-/*******************************************************************************\r
- * Possible states for different register bit fields\r
- */\r
-enum {\r
-    DISABLE = 0U,\r
-    ENABLE  = 1U\r
-};\r
-\r
-/*******************************************************************************\r
- * Static function declarations\r
- */\r
-static void default_tx_handler(uart_16550_instance_t * this_uart);\r
-\r
-/*******************************************************************************\r
- * Public function definitions\r
- */\r
-\r
-/***************************************************************************//**\r
- * UART_16550_init.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-void\r
-UART_16550_init\r
-(\r
-    uart_16550_instance_t* this_uart,\r
-    addr_t base_addr,\r
-    uint16_t baud_value,\r
-    uint8_t line_config\r
-)\r
-{\r
-#ifndef NDEBUG\r
-    uint8_t dbg1;\r
-    uint8_t dbg2;\r
-#endif\r
-    uint8_t fifo_config;\r
-    uint8_t temp;\r
-\r
-    HAL_ASSERT( base_addr != NULL_ADDR );\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE );\r
-\r
-    if( ( base_addr != NULL_ADDR ) && ( this_uart != NULL_INSTANCE ) )\r
-    {\r
-        /* disable interrupts */\r
-        HAL_set_8bit_reg(base_addr, IER, DISABLE);\r
-\r
-        /* reset divisor latch */\r
-        HAL_set_8bit_reg_field(base_addr, LCR_DLAB, ENABLE);\r
-#ifndef NDEBUG\r
-        dbg1 =  HAL_get_8bit_reg_field(base_addr, LCR_DLAB );\r
-        HAL_ASSERT( dbg1 == ENABLE );\r
-#endif\r
-        /* MSB of baud value */\r
-        temp = (uint8_t)(baud_value >> 8);\r
-        HAL_set_8bit_reg(base_addr, DMR, temp );\r
-        /* LSB of baud value */\r
-        HAL_set_8bit_reg(base_addr, DLR, ( (uint8_t)baud_value ) );\r
-#ifndef NDEBUG\r
-        dbg1 =  HAL_get_8bit_reg(base_addr, DMR );\r
-        dbg2 =  HAL_get_8bit_reg(base_addr, DLR );\r
-        HAL_ASSERT( ( ( ( (uint16_t) dbg1 ) << 8 ) | dbg2 ) == baud_value );\r
-#endif\r
-        /* reset divisor latch */\r
-        HAL_set_8bit_reg_field(base_addr, LCR_DLAB, DISABLE);\r
-#ifndef NDEBUG\r
-        dbg1 =  HAL_get_8bit_reg_field(base_addr, LCR_DLAB );\r
-        HAL_ASSERT( dbg1 == DISABLE );\r
-#endif\r
-        /* set the line control register (bit length, stop bits, parity) */\r
-        HAL_set_8bit_reg( base_addr, LCR, line_config );\r
-#ifndef NDEBUG\r
-        dbg1 =  HAL_get_8bit_reg(base_addr, LCR );\r
-        HAL_ASSERT( dbg1 == line_config)\r
-#endif\r
-        /* Enable and configure the RX and TX FIFOs. */\r
-        fifo_config = ((uint8_t)(DEFAULT_RX_TRIG_LEVEL << FCR_TRIG_LEVEL_SHIFT) |\r
-                                 FCR_RDYN_EN_MASK | FCR_CLEAR_RX_MASK |\r
-                                 FCR_CLEAR_TX_MASK | FCR_ENABLE_MASK );\r
-        HAL_set_8bit_reg( base_addr, FCR, fifo_config );\r
-\r
-        /* disable loopback */\r
-        HAL_set_8bit_reg_field( base_addr, MCR_LOOP, DISABLE );\r
-#ifndef NDEBUG\r
-        dbg1 =  HAL_get_8bit_reg_field(base_addr, MCR_LOOP);\r
-        HAL_ASSERT( dbg1 == DISABLE );\r
-#endif\r
-\r
-        /* Instance setup */\r
-        this_uart->base_address = base_addr;\r
-        this_uart->tx_buffer    = NULL_BUFF;\r
-        this_uart->tx_buff_size = TX_COMPLETE;\r
-        this_uart->tx_idx       = 0U;\r
-        this_uart->tx_handler   = default_tx_handler;\r
-\r
-        this_uart->rx_handler  = ( (uart_16550_irq_handler_t) 0 );\r
-        this_uart->linests_handler  = ( (uart_16550_irq_handler_t) 0 );\r
-        this_uart->modemsts_handler = ( (uart_16550_irq_handler_t) 0 );\r
-        this_uart->status = 0U;\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_polled_tx.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-void\r
-UART_16550_polled_tx\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    const uint8_t * pbuff,\r
-    uint32_t tx_size\r
-)\r
-{\r
-    uint32_t char_idx = 0U;\r
-    uint32_t size_sent;\r
-    uint8_t status;\r
-\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE );\r
-    HAL_ASSERT( pbuff != NULL_BUFF );\r
-    HAL_ASSERT( tx_size > 0U );\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) &&\r
-        ( pbuff != NULL_BUFF ) &&\r
-        ( tx_size > 0U ) )\r
-    {\r
-        /* Remain in this loop until the entire input buffer\r
-         * has been transferred to the UART.\r
-         */\r
-        do {\r
-            /* Read the Line Status Register and update the sticky record */\r
-            status = HAL_get_8bit_reg( this_uart->base_address, LSR );\r
-            this_uart->status |= status;\r
-\r
-            /* Check if TX FIFO is empty. */\r
-            if( status & LSR_THRE_MASK )\r
-            {\r
-                uint32_t fill_size = TX_FIFO_SIZE;\r
-\r
-                /* Calculate the number of bytes to transmit. */\r
-                if ( tx_size < TX_FIFO_SIZE )\r
-                {\r
-                    fill_size = tx_size;\r
-                }\r
-\r
-                /* Fill the TX FIFO with the calculated the number of bytes. */\r
-                for ( size_sent = 0U; size_sent < fill_size; ++size_sent )\r
-                {\r
-                    /* Send next character in the buffer. */\r
-                    HAL_set_8bit_reg( this_uart->base_address, THR,\r
-                                      (uint_fast8_t)pbuff[char_idx++]);\r
-                }\r
-\r
-                /* Calculate the number of untransmitted bytes remaining. */\r
-                tx_size -= size_sent;\r
-            }\r
-        } while ( tx_size );\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_polled_tx_string.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-void\r
-UART_16550_polled_tx_string\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    const uint8_t * p_sz_string\r
-)\r
-{\r
-    uint32_t char_idx = 0U;\r
-    uint32_t fill_size;\r
-    uint_fast8_t data_byte;\r
-    uint8_t status;\r
-\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE );\r
-    HAL_ASSERT( p_sz_string != NULL_BUFF );\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) && ( p_sz_string != NULL_BUFF ) )\r
-    {\r
-        char_idx = 0U;\r
-\r
-        /* Get the first data byte from the input buffer */\r
-        data_byte = (uint_fast8_t)p_sz_string[char_idx];\r
-\r
-        /* First check for the NULL terminator byte.\r
-         * Then remain in this loop until the entire string in the input buffer\r
-         * has been transferred to the UART.\r
-         */\r
-        while ( 0U != data_byte )\r
-        {\r
-            /* Wait until TX FIFO is empty. */\r
-            do {\r
-                status = HAL_get_8bit_reg( this_uart->base_address,LSR);\r
-                this_uart->status |= status;\r
-            } while ( !( status & LSR_THRE_MASK ) );\r
-\r
-            /* Send bytes from the input buffer until the TX FIFO is full\r
-             * or we reach the NULL terminator byte.\r
-             */\r
-            fill_size = 0U;\r
-            while ( (0U != data_byte) && (fill_size < TX_FIFO_SIZE) )\r
-            {\r
-                /* Send the data byte */\r
-                HAL_set_8bit_reg( this_uart->base_address, THR, data_byte );\r
-                ++fill_size;\r
-                char_idx++;\r
-                /* Get the next data byte from the input buffer */\r
-                data_byte = (uint_fast8_t)p_sz_string[char_idx];\r
-            }\r
-        }\r
-    }\r
-}\r
-\r
-\r
-/***************************************************************************//**\r
- * UART_16550_irq_tx.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-void\r
-UART_16550_irq_tx\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    const uint8_t * pbuff,\r
-    uint32_t tx_size\r
-)\r
-{\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    HAL_ASSERT( pbuff != NULL_BUFF )\r
-    HAL_ASSERT( tx_size > 0U )\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) &&\r
-        ( pbuff != NULL_BUFF ) &&\r
-        ( tx_size > 0U ) )\r
-    {\r
-        /*Initialize the UART instance with\r
-          parameters required for transmission.*/\r
-        this_uart->tx_buffer = pbuff;\r
-        this_uart->tx_buff_size = tx_size;\r
-        /* char_idx; */\r
-        this_uart->tx_idx = 0U;\r
-        /* assign handler for default data transmission */\r
-        this_uart->tx_handler = default_tx_handler;\r
-\r
-        /* enables TX interrupt */\r
-        HAL_set_8bit_reg_field(this_uart->base_address, IER_ETBEI, ENABLE);\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_tx_complete.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-int8_t\r
-UART_16550_tx_complete\r
-(\r
-    uart_16550_instance_t * this_uart\r
-)\r
-{\r
-    int8_t returnvalue = 0;\r
-    uint8_t status = 0U;\r
-\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-\r
-    if( this_uart != NULL_INSTANCE )\r
-    {\r
-        status = HAL_get_8bit_reg(this_uart->base_address,LSR);\r
-        this_uart->status |= status;\r
-\r
-        if( ( this_uart->tx_buff_size == TX_COMPLETE ) &&\r
-                             ( status & LSR_TEMT_MASK ) )\r
-        {\r
-            returnvalue = (int8_t)1;\r
-        }\r
-    }\r
-    return returnvalue;\r
-}\r
-\r
-\r
-/***************************************************************************//**\r
- * UART_16550_get_rx.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-size_t\r
-UART_16550_get_rx\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uint8_t * rx_buff,\r
-    size_t buff_size\r
-)\r
-{\r
-    uint8_t status;\r
-    size_t rx_size = 0U;\r
-\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    HAL_ASSERT( rx_buff != (uint8_t *)0 )\r
-    HAL_ASSERT( buff_size > 0U )\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) &&\r
-        ( rx_buff != (uint8_t *)0 ) &&\r
-        ( buff_size > 0U ) )\r
-    {\r
-        status = HAL_get_8bit_reg( this_uart->base_address, LSR );\r
-        this_uart->status |= status;\r
-        while ( ((status & LSR_DR_MASK) != 0U) && ( rx_size < buff_size ) )\r
-        {\r
-            rx_buff[rx_size] = HAL_get_8bit_reg( this_uart->base_address, RBR );\r
-            rx_size++;\r
-            status = HAL_get_8bit_reg( this_uart->base_address, LSR );\r
-            this_uart->status |= status;\r
-        }\r
-    }\r
-    return rx_size;\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_isr.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-void\r
-UART_16550_isr\r
-(\r
-    uart_16550_instance_t * this_uart\r
-)\r
-{\r
-    uint8_t iirf;\r
-\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-\r
-    if(this_uart != NULL_INSTANCE )\r
-    {\r
-        iirf = HAL_get_8bit_reg_field( this_uart->base_address, IIR_IIR );\r
-\r
-        switch ( iirf )\r
-        {\r
-            /* Modem status interrupt */\r
-            case IIRF_MODEM_STATUS:\r
-            {\r
-                if( INVALID_IRQ_HANDLER != this_uart->modemsts_handler  )\r
-                {\r
-                    HAL_ASSERT( INVALID_IRQ_HANDLER != this_uart->modemsts_handler );\r
-                    if( INVALID_IRQ_HANDLER != this_uart->modemsts_handler )\r
-                    {\r
-                        (*(this_uart->modemsts_handler))(this_uart);\r
-                    }\r
-                }\r
-            }\r
-            break;\r
-            /* Transmitter Holding Register Empty interrupt */\r
-            case IIRF_THRE:\r
-            {\r
-                HAL_ASSERT( INVALID_IRQ_HANDLER != this_uart->tx_handler );\r
-                if ( INVALID_IRQ_HANDLER != this_uart->tx_handler )\r
-                {\r
-                    (*(this_uart->tx_handler))(this_uart);\r
-                }\r
-            }\r
-            break;\r
-            /* Received Data Available interrupt */\r
-            case IIRF_RX_DATA:\r
-            case IIRF_DATA_TIMEOUT:\r
-            {\r
-                HAL_ASSERT( INVALID_IRQ_HANDLER != this_uart->rx_handler );\r
-                if ( INVALID_IRQ_HANDLER != this_uart->rx_handler )\r
-                {\r
-                    (*(this_uart->rx_handler))(this_uart);\r
-                }\r
-            }\r
-            break;\r
-            /* Line status interrupt */\r
-            case IIRF_RX_LINE_STATUS:\r
-            {\r
-                HAL_ASSERT( INVALID_IRQ_HANDLER != this_uart->linests_handler );\r
-                if ( INVALID_IRQ_HANDLER != this_uart->linests_handler )\r
-                {\r
-                    (*(this_uart->linests_handler))(this_uart);\r
-                }\r
-            }\r
-            break;\r
-            /* Unidentified interrupt */\r
-            default:\r
-            {\r
-                HAL_ASSERT( INVALID_INTERRUPT )\r
-            }\r
-        }\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_set_rx_handler.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-void\r
-UART_16550_set_rx_handler\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uart_16550_irq_handler_t handler,\r
-    uart_16550_rx_trig_level_t trigger_level\r
-)\r
-{\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    HAL_ASSERT( handler != INVALID_IRQ_HANDLER)\r
-    HAL_ASSERT( trigger_level < UART_16550_FIFO_INVALID_TRIG_LEVEL)\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) &&\r
-        ( handler != INVALID_IRQ_HANDLER) &&\r
-        ( trigger_level < UART_16550_FIFO_INVALID_TRIG_LEVEL) )\r
-    {\r
-        this_uart->rx_handler = handler;\r
-\r
-        /* Set the receive interrupt trigger level. */\r
-        HAL_set_8bit_reg_field( this_uart->base_address,\r
-                            FCR_TRIG_LEVEL, trigger_level );\r
-\r
-        /* Enable receive interrupt. */\r
-        HAL_set_8bit_reg_field( this_uart->base_address, IER_ERBFI, ENABLE );\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_set_loopback.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-void\r
-UART_16550_set_loopback\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uart_16550_loopback_t loopback\r
-)\r
-{\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE );\r
-    HAL_ASSERT( loopback < UART_16550_INVALID_LOOPBACK );\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) &&\r
-        ( loopback < UART_16550_INVALID_LOOPBACK ) )\r
-    {\r
-        if ( loopback == UART_16550_LOOPBACK_OFF )\r
-        {\r
-            HAL_set_8bit_reg_field( this_uart->base_address,\r
-                                    MCR_LOOP,\r
-                                    DISABLE );\r
-        }\r
-        else\r
-        {\r
-            HAL_set_8bit_reg_field( this_uart->base_address,\r
-                                    MCR_LOOP,\r
-                                    ENABLE );\r
-        }\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_get_rx_status.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-uint8_t\r
-UART_16550_get_rx_status\r
-(\r
-    uart_16550_instance_t * this_uart\r
-)\r
-{\r
-    uint8_t status = UART_16550_INVALID_PARAM;\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE );\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) )\r
-    {\r
-        /*\r
-         * Bit 1 - Overflow error status\r
-         * Bit 2 - Parity error status\r
-         * Bit 3 - Frame error status\r
-         * Bit 4 - Break interrupt indicator\r
-         * Bit 7 - FIFO data error status\r
-         */\r
-        this_uart->status |= HAL_get_8bit_reg( this_uart->base_address, LSR );\r
-        status = ( this_uart->status & STATUS_ERROR_MASK );\r
-        /*\r
-         * Clear the sticky status for this instance.\r
-         */\r
-        this_uart->status = (uint8_t)0;\r
-    }\r
-    return status;\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_get_modem_status.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-uint8_t\r
-UART_16550_get_modem_status\r
-(\r
-    uart_16550_instance_t * this_uart\r
-)\r
-{\r
-    uint8_t status = UART_16550_NO_ERROR;\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) )\r
-    {\r
-        /*\r
-         * Extract UART error status and place in lower bits of "status".\r
-         * Bit 0 - Delta Clear to Send Indicator\r
-         * Bit 1 - Delta Clear to Receive Indicator\r
-         * Bit 2 - Trailing edge of Ring Indicator detector\r
-         * Bit 3 - Delta Data Carrier Detect indicator\r
-         * Bit 4 - Clear To Send\r
-         * Bit 5 - Data Set Ready\r
-         * Bit 6 - Ring Indicator\r
-         * Bit 7 - Data Carrier Detect\r
-         */\r
-        status = HAL_get_8bit_reg( this_uart->base_address, MSR );\r
-    }\r
-    return status;\r
-}\r
-\r
-/***************************************************************************//**\r
- * Default TX interrupt handler to automatically transmit data from\r
- * user assgined TX buffer.\r
- */\r
-static void\r
-default_tx_handler\r
-(\r
-    uart_16550_instance_t * this_uart\r
-)\r
-{\r
-    uint8_t status;\r
-\r
-    HAL_ASSERT( NULL_INSTANCE != this_uart )\r
-\r
-    if ( this_uart != NULL_INSTANCE )\r
-    {\r
-        HAL_ASSERT( NULL_BUFF != this_uart->tx_buffer )\r
-        HAL_ASSERT( 0U != this_uart->tx_buff_size )\r
-\r
-        if ( ( this_uart->tx_buffer != NULL_BUFF ) &&\r
-             ( 0U != this_uart->tx_buff_size ) )\r
-        {\r
-            /* Read the Line Status Register and update the sticky record. */\r
-            status = HAL_get_8bit_reg( this_uart->base_address,LSR);\r
-            this_uart->status |= status;\r
-    \r
-            /*\r
-             * This function should only be called as a result of a THRE interrupt.\r
-             * Verify that this is true before proceeding to transmit data.\r
-             */\r
-            if ( status & LSR_THRE_MASK )\r
-            {\r
-                uint32_t size_sent = 0U;\r
-                uint32_t fill_size = TX_FIFO_SIZE;\r
-                uint32_t tx_remain = this_uart->tx_buff_size - this_uart->tx_idx;\r
-    \r
-                /* Calculate the number of bytes to transmit. */\r
-                if ( tx_remain < TX_FIFO_SIZE )\r
-                {\r
-                    fill_size = tx_remain;\r
-                }\r
-    \r
-                /* Fill the TX FIFO with the calculated the number of bytes. */\r
-                for ( size_sent = 0U; size_sent < fill_size; ++size_sent )\r
-                {\r
-                    /* Send next character in the buffer. */\r
-                    HAL_set_8bit_reg( this_uart->base_address, THR,\r
-                            (uint_fast8_t)this_uart->tx_buffer[this_uart->tx_idx]);\r
-                    ++this_uart->tx_idx;\r
-                }\r
-            }\r
-    \r
-            /* Flag Tx as complete if all data has been pushed into the Tx FIFO. */\r
-            if ( this_uart->tx_idx == this_uart->tx_buff_size )\r
-            {\r
-                this_uart->tx_buff_size = TX_COMPLETE;\r
-                /* disables TX interrupt */\r
-                HAL_set_8bit_reg_field( this_uart->base_address,\r
-                                        IER_ETBEI, DISABLE);\r
-            }\r
-        }\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_enable_irq.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-void\r
-UART_16550_enable_irq\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uint8_t irq_mask\r
-)\r
-{\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-\r
-    if( this_uart != NULL_INSTANCE )\r
-    {\r
-        /* irq_mask encoding: 1- enable\r
-         * bit 0 - Receive Data Available Interrupt\r
-         * bit 1 - Transmitter Holding  Register Empty Interrupt\r
-         * bit 2 - Receiver Line Status Interrupt\r
-         * bit 3 - Modem Status Interrupt\r
-         */\r
-        /* read present interrupts for enabled ones*/\r
-        irq_mask |= HAL_get_8bit_reg( this_uart->base_address, IER );\r
-        /* Enable interrupts */\r
-        HAL_set_8bit_reg( this_uart->base_address, IER, irq_mask );\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_disable_irq.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-void\r
-UART_16550_disable_irq\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uint8_t irq_mask\r
-)\r
-{\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-\r
-    if( this_uart != NULL_INSTANCE )\r
-    {\r
-        /* irq_mask encoding:  1 - disable\r
-         * bit 0 - Receive Data Available Interrupt\r
-         * bit 1 - Transmitter Holding  Register Empty Interrupt\r
-         * bit 2 - Receiver Line Status Interrupt\r
-         * bit 3 - Modem Status Interrupt\r
-         */\r
-        /* read present interrupts for enabled ones */\r
-        irq_mask = (( (uint8_t)~irq_mask ) & \r
-                    HAL_get_8bit_reg( this_uart->base_address, IER ));\r
-        /* Disable interrupts */\r
-        HAL_set_8bit_reg( this_uart->base_address, IER, irq_mask );\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_set_rxstatus_handler.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-void\r
-UART_16550_set_rxstatus_handler\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uart_16550_irq_handler_t handler\r
-)\r
-{\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    HAL_ASSERT( handler != INVALID_IRQ_HANDLER)\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) &&\r
-        ( handler != INVALID_IRQ_HANDLER) )\r
-    {\r
-        this_uart->linests_handler = handler;\r
-        /* Enable receiver line status interrupt. */\r
-        HAL_set_8bit_reg_field( this_uart->base_address, IER_ELSI, ENABLE );\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_set_tx_handler.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-void\r
-UART_16550_set_tx_handler\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uart_16550_irq_handler_t handler\r
-)\r
-{\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    HAL_ASSERT( handler != INVALID_IRQ_HANDLER)\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) &&\r
-        ( handler != INVALID_IRQ_HANDLER) )\r
-    {\r
-        this_uart->tx_handler = handler;\r
-\r
-        /* Make TX buffer info invalid */\r
-        this_uart->tx_buffer = NULL_BUFF;\r
-        this_uart->tx_buff_size = 0U;\r
-\r
-        /* Enable transmitter holding register Empty interrupt. */\r
-        HAL_set_8bit_reg_field( this_uart->base_address, IER_ETBEI, ENABLE );\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_set_modemstatus_handler.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-void\r
-UART_16550_set_modemstatus_handler\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uart_16550_irq_handler_t handler\r
-)\r
-{\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    HAL_ASSERT( handler != INVALID_IRQ_HANDLER)\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) &&\r
-        ( handler != INVALID_IRQ_HANDLER) )\r
-    {\r
-        this_uart->modemsts_handler = handler;\r
-        /* Enable modem status interrupt. */\r
-        HAL_set_8bit_reg_field( this_uart->base_address, IER_EDSSI, ENABLE );\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_fill_tx_fifo.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-size_t\r
-UART_16550_fill_tx_fifo\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    const uint8_t * tx_buffer,\r
-    size_t tx_size\r
-)\r
-{\r
-    uint8_t status;\r
-    size_t size_sent = 0U;\r
-\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    HAL_ASSERT( tx_buffer != NULL_BUFF )\r
-    HAL_ASSERT( tx_size > 0U )\r
-\r
-    /* Fill the UART's Tx FIFO until the FIFO is full or the complete input\r
-     * buffer has been written. */\r
-    if( (this_uart != NULL_INSTANCE) &&\r
-        (tx_buffer != NULL_BUFF)   &&\r
-        (tx_size > 0U) )\r
-    {\r
-        /* Read the Line Status Register and update the sticky record. */\r
-        status = HAL_get_8bit_reg( this_uart->base_address, LSR );\r
-        this_uart->status |= status;\r
-\r
-        /* Check if TX FIFO is empty. */\r
-        if( status & LSR_THRE_MASK )\r
-        {\r
-            uint32_t fill_size = TX_FIFO_SIZE;\r
-\r
-            /* Calculate the number of bytes to transmit. */\r
-            if ( tx_size < TX_FIFO_SIZE )\r
-            {\r
-                fill_size = tx_size;\r
-            }\r
-\r
-            /* Fill the TX FIFO with the calculated the number of bytes. */\r
-            for ( size_sent = 0U; size_sent < fill_size; ++size_sent )\r
-            {\r
-                /* Send next character in the buffer. */\r
-                HAL_set_8bit_reg( this_uart->base_address, THR,\r
-                                  (uint_fast8_t)tx_buffer[size_sent]);\r
-            }\r
-        }\r
-    }\r
-    return size_sent;\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_16550_get_tx_status.\r
- * See core_16550.h for details of how to use this function.\r
- */\r
-uint8_t\r
-UART_16550_get_tx_status\r
-(\r
-    uart_16550_instance_t * this_uart\r
-)\r
-{\r
-    uint8_t status = UART_16550_TX_BUSY;\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE );\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) )\r
-    {\r
-        /* Read the Line Status Register and update the sticky record. */\r
-        status = HAL_get_8bit_reg( this_uart->base_address, LSR );\r
-        this_uart->status |= status;\r
-        /*\r
-         * Extract the transmit status bits from the UART's Line Status Register.\r
-         * Bit 5 - Transmitter Holding Register/FIFO Empty (THRE) status. (If = 1, TX FIFO is empty)\r
-         * Bit 6 - Transmitter Empty (TEMT) status. (If = 1, both TX FIFO and shift register are empty)\r
-         */\r
-        status &= ( LSR_THRE_MASK | LSR_TEMT_MASK );\r
-    }\r
-    return status;\r
-}\r
-\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/Core16550/core_16550.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/Core16550/core_16550.h
deleted file mode 100644 (file)
index 98b1f16..0000000
+++ /dev/null
@@ -1,1264 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2007-2015 Microsemi SoC Products Group. All rights reserved.\r
- *\r
- * This file contains the application programming interface for the Core16550\r
- * bare metal driver.\r
- *\r
- * SVN $Revision: 7963 $\r
- * SVN $Date: 2015-10-09 17:58:21 +0530 (Fri, 09 Oct 2015) $\r
- */\r
-/*=========================================================================*//**\r
-  @mainpage Core16550 Bare Metal Driver.\r
-\r
-  @section intro_sec Introduction\r
-  The Core16550 is an implementation of the Universal Asynchronous\r
-  Receiver/Transmitter aimed at complete compliance to standard 16550 UART.\r
-  The Core16550 bare metal software driver is designed for use in systems\r
-  with no operating system.\r
-\r
-  The Core16550 driver provides functions for polled and interrupt driven\r
-  transmitting and receiving. It also provides functions for reading the\r
-  values from different status registers, enabling and disabling interrupts\r
-  at Core16550 level. The Core16550 driver is provided as C source code.\r
-\r
-  @section driver_configuration Driver Configuration\r
-  Your application software should configure the Core16550 driver through\r
-  calls to the UART_16550_init() function for each Core16550 instance in\r
-  the hardware design. The configuration parameters include the Core16550\r
-  hardware instance base address and other runtime parameters, such as baud\r
-  value, bit width, and parity.\r
-\r
-  No Core16550 hardware configuration parameters are needed by the driver,\r
-  apart from the Core16550 hardware instance base address. Hence, no\r
-  additional configuration files are required to use the driver.\r
-\r
-  @section theory_op Theory of Operation\r
-  The Core16550 software driver is designed to allow the control of multiple\r
-  instances of Core16550. Each instance of Core16550 in the hardware design\r
-  is associated with a single instance of the uart_16550_instance_t structure\r
-  in the software. You need to allocate memory for one unique\r
-  uart_16550_instance_t structure instance for each Core16550 hardware instance.\r
-  The contents of these data structures are initialized during calls to\r
-  function UART_16550_init(). A pointer to the structure is passed to\r
-  subsequent driver functions in order to identify the Core16550 hardware\r
-  instance you wish to perform the requested operation on.\r
-\r
-  Note:     Do not attempt to directly manipulate the content of\r
-  uart_16550_instance_t structures. This structure is only intended to be\r
-  modified by the driver function.\r
-\r
-  Initialization\r
-  The Core16550 driver is initialized through a call to the UART_16550_init()\r
-  function. This function takes the UART\92s configuration as parameters.\r
-  The UART_16550_init() function must be called before any other Core16550\r
-  driver functions can be called.\r
-\r
-  Polled Transmission and Reception\r
-  The driver can be used to transmit and receive data once initialized. Polled\r
-  operations where the driver constantly polls the state of the UART registers\r
-  in order to control data transmit or data receive are performed using these\r
-  functions:\r
-         \95  UART_16550_polled_tx()\r
-         \95  UART_16550_polled_tx_string\r
-         \95  UART_16550_fill_tx_fifo()\r
-         \95  UART_16550_get_rx()\r
-\r
-  Data is transmitted using the UART_16550_polled_tx() function. This function\r
-  is blocking, meaning that it will only return once the data passed to the\r
-  function has been sent to the Core16550 hardware. Data received by the\r
-  Core16550 hardware can be read by the UART_16550_get_rx() function.\r
-\r
-  The UART_16550_polled_tx_string() function is provided to transmit a NULL (\91\0\92)\r
-  terminated string in polled mode. This function is blocking, meaning that it\r
-  will only return once the data passed to the function has been sent to the\r
-  Core16550 hardware.\r
-\r
-  The UART_16550_fill_tx_fifo() function fills the Core16550 hardware transmit\r
-  FIFO with data from a buffer passed as a parameter and returns the number of\r
-  bytes transferred to the FIFO. If the transmit FIFO is not empty when the\r
-  UART_16550_fill_tx_fifo() function is called it returns immediately without\r
-  transferring any data to the FIFO.\r
-\r
-  Interrupt Driven Operations\r
-  The driver can also transmit or receive data under interrupt control, freeing\r
-  your application to perform other tasks until an interrupt occurs indicating\r
-  that the driver\92s attention is required. Interrupt controlled UART operations\r
-  are performed using these functions:\r
-        \95   UART_16550_isr()\r
-        \95   UART_16550_irq_tx()\r
-        \95   UART_16550_tx_complete()\r
-        \95   UART_16550_set_tx_handler()\r
-        \95   UART_16550_set_rx_handler()\r
-        \95   UART_16550_set_rxstatus_handler()\r
-        \95   UART_16550_set_modemstatus_handler()\r
-        \95   UART_16550_enable_irq()\r
-        \95   UART_16550_disable_irq()\r
-\r
-  Interrupt Handlers\r
-  The UART_16550_isr() function is the top level interrupt handler function for\r
-  the Core16550 driver. You must call it from the system level\r
-  (CoreInterrupt and NVIC level) interrupt service routine (ISR) assigned to the\r
-  interrupt triggered by the Core16550 INTR signal. The UART_16550_isr() function\r
-  identifies the source of the Core16550 interrupt and calls the corresponding\r
-  handler function previously registered with the driver through calls to the\r
-  UART_16550_set_rx_handler(), UART_16550_set_tx_handler(),\r
-  UART_16550_set_rxstatus_handler(), and UART_16550_set_modemstatus_handler()\r
-  functions. You are responsible for creating these lower level interrupt handlers\r
-  as part of your application program and registering them with the driver.\r
-  The UART_16550_enable_irq() and UART_16550_disable_irq() functions are used to\r
-  enable or disable the received line status, received data available/character\r
-  timeout, transmit holding register empty and modem status interrupts at the\r
-  Core16550 level.\r
-\r
-  Transmitting Data\r
-  Interrupt-driven transmit is initiated by a call to UART_16550_irq_tx(),\r
-  specifying the block of data to transmit. Your application is then free to\r
-  perform other tasks and inquire later whether transmit has completed by calling\r
-  the UART_16550_tx_complete() function. The UART_16550_irq_tx() function enables\r
-  the UART\92s transmit holding register empty (THRE) interrupt and then, when the\r
-  interrupt goes active, the driver\92s default THRE interrupt handler transfers\r
-  the data block to the UART until the entire block is transmitted.\r
-\r
-  Note:     You can use the UART_16550_set_tx_handler() function to assign an\r
-  alternative handler to the THRE interrupt. In this case, you must not use the\r
-  UART_16550_irq_tx() function to initiate the transmit, as this will re-assign\r
-  the driver\92s default THRE interrupt handler to the THRE interrupt. Instead,\r
-  your alternative THRE interrupt handler must include a call to the\r
-  UART_16550_fill_tx_fifo() function to transfer the data to the UART.\r
-\r
-  Receiving Data\r
-  Interrupt-driven receive is performed by first calling UART_16550_set_rx_handler()\r
-  to register a receive handler function that will be called by the driver whenever\r
-  receive data is available. You must provide this receive handler function which\r
-  must include a call to the UART_16550_get_rx() function to actually read the\r
-  received data.\r
-\r
-  UART Status\r
-  The function UART_16550_get_rx_status() is used to read the receiver error status.\r
-  This function returns the overrun, parity, framing, break, and FIFO error status\r
-  of the receiver.\r
-  The function UART_16550_get_tx_status() is used to read the transmitter status.\r
-  This function returns the transmit empty (TEMT) and transmit holding register\r
-  empty (THRE) status of the transmitter.\r
-  The function UART_16550_get_modem_status() is used to read the modem status flags.\r
-  This function returns the current value of the modem status register.\r
-\r
-  Loopback\r
-  The function UART_16550_set_loopback() is used to enable or disable loopback\r
-  between Tx and Rx lines internal to Core16550.\r
-*//*=========================================================================*/\r
-#ifndef __CORE_16550_H\r
-#define __CORE_16550_H 1\r
-\r
-#include "cpu_types.h"\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-/***************************************************************************//**\r
- * Receiver Error Status\r
- * The following defines are used to determine the UART receiver error type.\r
- * These bit mask constants are used with the return value of the\r
- * UART_16550_get_rx_status() function to find out if any errors occurred\r
- * while receiving data.\r
- */\r
-#define UART_16550_NO_ERROR         ( (uint8_t) 0x00 )\r
-#define UART_16550_OVERRUN_ERROR    ( (uint8_t) 0x02 )\r
-#define UART_16550_PARITY_ERROR     ( (uint8_t) 0x04 )\r
-#define UART_16550_FRAMING_ERROR    ( (uint8_t) 0x08 )\r
-#define UART_16550_BREAK_ERROR      ( (uint8_t) 0x10 )\r
-#define UART_16550_FIFO_ERROR       ( (uint8_t) 0x80 )\r
-#define UART_16550_INVALID_PARAM    ( (uint8_t) 0xFF )\r
-\r
-/***************************************************************************//**\r
- * Modem Status\r
- * The following defines are used to determine the modem status. These bit\r
- * mask constants are used with the return value of the\r
- * UART_16550_get_modem_status() function to find out the modem status of\r
- * the UART.\r
- */\r
-#define UART_16550_DCTS             ( (uint8_t) 0x01 )\r
-#define UART_16550_DDSR             ( (uint8_t) 0x02 )\r
-#define UART_16550_TERI             ( (uint8_t) 0x04 )\r
-#define UART_16550_DDCD             ( (uint8_t) 0x08 )\r
-#define UART_16550_CTS              ( (uint8_t) 0x10 )\r
-#define UART_16550_DSR              ( (uint8_t) 0x20 )\r
-#define UART_16550_RI               ( (uint8_t) 0x40 )\r
-#define UART_16550_DCD              ( (uint8_t) 0x80 )\r
-\r
-/***************************************************************************//**\r
- * Transmitter Status\r
- * The following definitions are used to determine the UART transmitter status.\r
- * These bit mask constants are used with the return value of the\r
- * UART_16550_get_tx_status() function to find out the status of the\r
- * transmitter.\r
- */\r
-#define UART_16550_TX_BUSY          ( (uint8_t) 0x00 )\r
-#define UART_16550_THRE             ( (uint8_t) 0x20 )\r
-#define UART_16550_TEMT             ( (uint8_t) 0x40 )\r
-\r
-/***************************************************************************//**\r
- * Core16550 Interrupts\r
- * The following defines are used to enable and disable Core16550 interrupts.\r
- * They are used to build the value of the irq_mask parameter for the\r
- * UART_16550_enable_irq() and UART_16550_disable_irq() functions. A bitwise\r
- * OR of these constants is used to enable or disable multiple interrupts.\r
- */\r
-#define UART_16550_RBF_IRQ          ( (uint8_t) 0x01 )\r
-#define UART_16550_TBE_IRQ          ( (uint8_t) 0x02 )\r
-#define UART_16550_LS_IRQ           ( (uint8_t) 0x04 )\r
-#define UART_16550_MS_IRQ           ( (uint8_t) 0x08 )\r
-\r
-/***************************************************************************//**\r
- * Data Width\r
- * The following defines are used to build the value of the UART_16550_init()\r
- * function line_config parameter.\r
- */\r
-#define UART_16550_DATA_5_BITS      ( (uint8_t) 0x00 )\r
-#define UART_16550_DATA_6_BITS      ( (uint8_t) 0x01 )\r
-#define UART_16550_DATA_7_BITS      ( (uint8_t) 0x02 )\r
-#define UART_16550_DATA_8_BITS      ( (uint8_t) 0x03 )\r
-\r
-/***************************************************************************//**\r
- * Parity Control\r
- * The following defines are used to build the value of the UART_16550_init()\r
- * function line_config parameter.\r
- */\r
-#define UART_16550_NO_PARITY            ( (uint8_t) 0x00 )\r
-#define UART_16550_ODD_PARITY           ( (uint8_t) 0x08 )\r
-#define UART_16550_EVEN_PARITY          ( (uint8_t) 0x18 )\r
-#define UART_16550_STICK_PARITY_1       ( (uint8_t) 0x28 )\r
-#define UART_16550_STICK_PARITY_0       ( (uint8_t) 0x38 )\r
-\r
-/***************************************************************************//**\r
- * Number of Stop Bits\r
- * The following defines are used to build the value of the UART_16550_init()\r
- * function line_config parameter.\r
- */\r
-#define UART_16550_ONE_STOP_BIT     ( (uint8_t) 0x00 )\r
-/*only when data bits is 5*/\r
-#define UART_16550_ONEHALF_STOP_BIT ( (uint8_t) 0x04 )\r
-/*only when data bits is not 5*/\r
-#define UART_16550_TWO_STOP_BITS    ( (uint8_t) 0x04 )\r
-\r
-/***************************************************************************//**\r
-  This enumeration specifies the receiver FIFO trigger level. This is the number\r
-  of bytes that must be received before the UART generates a receive data\r
-  available interrupt. It provides the allowed values for the\r
-  UART_16550_set_rx_handler() function\92s trigger_level parameter.\r
- */\r
-typedef enum {\r
-    UART_16550_FIFO_SINGLE_BYTE    = 0,\r
-    UART_16550_FIFO_FOUR_BYTES     = 1,\r
-    UART_16550_FIFO_EIGHT_BYTES    = 2,\r
-    UART_16550_FIFO_FOURTEEN_BYTES = 3,\r
-    UART_16550_FIFO_INVALID_TRIG_LEVEL\r
-} uart_16550_rx_trig_level_t;\r
-\r
-/***************************************************************************//**\r
-  This enumeration specifies the Loopback configuration of the UART. It provides\r
-  the allowed values for the UART_16550_set_loopback() function\92s loopback\r
-  parameter.\r
- */\r
-typedef enum {\r
-    UART_16550_LOOPBACK_OFF   = 0,\r
-    UART_16550_LOOPBACK_ON    = 1,\r
-    UART_16550_INVALID_LOOPBACK\r
-} uart_16550_loopback_t;\r
-\r
-/***************************************************************************//**\r
-  This is type definition for Core16550 instance. You need to create and\r
-  maintain a record of this type. This holds all data regarding the Core16550\r
-  instance.\r
- */\r
-typedef struct uart_16550_instance uart_16550_instance_t;\r
-\r
-/***************************************************************************//**\r
-  This typedef specifies the function prototype for Core16550 interrupt handlers.\r
-  All interrupt handlers registered with the Core16550 driver must be of this\r
-  type. The interrupt handlers are registered with the driver through the\r
-  UART_16550_set_rx_handler(), UART_16550_set_tx_handler(),\r
-  UART_16550_set_rxstatus_handler(), and UART_16550_set_modemstatus_handler()\r
-  functions.\r
-\r
-  The this_uart parameter is a pointer to a uart_16550_instance_t structure that\r
-  holds all data regarding this instance of the Core16550.\r
- */\r
-typedef void (*uart_16550_irq_handler_t)(uart_16550_instance_t * this_uart);\r
-\r
-/***************************************************************************//**\r
-  uart_16550_instance.\r
-  This structure is used to identify the various Core16550 hardware instances\r
-  in your system. Your application software should declare one instance of this\r
-  structure for each instance of Core16550 in your system. The function\r
-  UART_16550_init() initializes this structure. A pointer to an initialized\r
-  instance of the structure should be passed as the first parameter to the\r
-  Core16550 driver functions, to identify which Core16550 hardware instance\r
-  should perform the requested operation.\r
- */\r
-struct uart_16550_instance{\r
-    /* Core16550 instance base address: */\r
-    addr_t      base_address;\r
-    /* Accumulated status: */\r
-    uint8_t     status;\r
-\r
-    /* transmit related info: */\r
-    const uint8_t*  tx_buffer;\r
-    uint32_t        tx_buff_size;\r
-    uint32_t        tx_idx;\r
-\r
-    /* line status (OE, PE, FE & BI) interrupt handler:*/\r
-    uart_16550_irq_handler_t linests_handler;\r
-    /* receive interrupt handler:*/\r
-    uart_16550_irq_handler_t rx_handler;\r
-    /* transmitter holding register interrupt handler:*/\r
-    uart_16550_irq_handler_t tx_handler;\r
-    /* modem status interrupt handler:*/\r
-    uart_16550_irq_handler_t modemsts_handler;\r
-};\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_init() function initializes the driver\92s data structures and\r
- * the Core16550 hardware with the configuration passed as parameters.. The\r
- * configuration parameters are the baud_value used to generate the baud rate,\r
- * and the line_config used to specify the line configuration (bit length,\r
- * stop bits and parity).\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550. This pointer\r
- *                      is used to identify the target Core16550 hardware\r
- *                      instance in subsequent calls to the Core16550 driver\r
- *                      functions.\r
- * @param base_addr     The base_address parameter is the base address in the\r
- *                      processor's memory map for the registers of the\r
- *                      Core16550 instance being initialized.\r
- * @param baud_value    The baud_value parameter is used to select the baud rate\r
- *                      for the UART. The baud value is calculated from the\r
- *                      frequency of the system clock in Hertz and the desired\r
- *                      baud rate using the following equation:\r
- *\r
- *                      baud_value = (clock /(baud_rate * 16))\r
- *\r
- *                      The baud_value parameter must be a value in the range 0\r
- *                      to 65535 (or 0x0000 to 0xFFFF).\r
- * @param line_config   This parameter is the line configuration specifying the\r
- *                      bit length, number of stop bits and parity settings. This\r
- *                      is a bitwise OR of one value from each of the following\r
- *                      groups of allowed values:\r
- *                      \95   Data lengths:\r
- *                          UART_16550_DATA_5_BITS\r
- *                          UART_16550_DATA_6_BITS\r
- *                          UART_16550_DATA_7_BITS\r
- *                          UART_16550_DATA_8_BITS\r
- *                      \95   Parity types:\r
- *                          UART_16550_NO_PARITY\r
- *                          UART_16550_EVEN_PARITY\r
- *                          UART_16550_ODD_PARITY\r
- *                          UART_16550_STICK_PARITY_0\r
- *                          UART_16550_STICK_PARITY_1\r
- *                      \95   Number of stop bits:\r
- *                          UART_16550_ONE_STOP_BIT\r
- *                          UART_16550_ONEHALF_STOP_BIT\r
- *                          UART_16550_TWO_STOP_BITS\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- * #define UART_16550_BASE_ADDR   0x2A000000\r
- * #define BAUD_VALUE_57600    26\r
- *\r
- * uart_16550_instance_t g_uart;\r
- *\r
- * UART_16550_init( &g_uart, UART_16550_BASE_ADDR, BAUD_VALUE_57600,\r
- *                  (UART_16550_DATA_8_BITS |\r
- *                   UART_16550_EVEN_PARITY |\r
- *                   UART_16550_ONE_STOP_BIT) );\r
- * @endcode\r
- */\r
-void\r
-UART_16550_init\r
-(\r
-    uart_16550_instance_t* this_uart,\r
-    addr_t base_addr,\r
-    uint16_t baud_value,\r
-    uint8_t line_config\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_polled_tx() function is used to transmit data. It transfers\r
- * the contents of the transmitter data buffer, passed as a function parameter,\r
- * into the UART's hardware transmitter FIFO. It returns when the full content\r
- * of the transmitter data buffer has been transferred to the UART's transmitter\r
- * FIFO. It is safe to release or reuse the memory used as the transmitter data\r
- * buffer once this function returns.\r
- *\r
- * Note:    This function reads the UART\92s line status register (LSR) to poll\r
- * for the active state of the transmitter holding register empty (THRE) bit\r
- * before transferring data from the data buffer to the transmitter FIFO. It\r
- * transfers data to the transmitter FIFO in blocks of 16 bytes or less and\r
- * allows the FIFO to empty before transferring the next block of data.\r
- *\r
- * Note:    The actual transmission over the serial connection will still be in\r
- * progress when this function returns. Use the UART_16550_get_tx_status()\r
- * function if you need to know when the transmitter is empty.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all\r
- *                      data regarding this instance of the Core16550.\r
- * @param pbuff         The pbuff parameter is a pointer to a buffer containing\r
- *                      the data to be transmitted.\r
- * @param tx_size       The tx_size parameter is the size, in bytes, of the\r
- *                      data to be transmitted.\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- *   uint8_t testmsg1[] = {"\n\r\n\r\n\rUART_16550_polled_tx() test message 1"};\r
- *   UART_16550_polled_tx(&g_uart,(const uint8_t *)testmsg1,sizeof(testmsg1));\r
- * @endcode\r
- */\r
-void\r
-UART_16550_polled_tx\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    const uint8_t * pbuff,\r
-    uint32_t tx_size\r
-);\r
-/***************************************************************************//**\r
- * The UART_16550_polled_tx_string() function is used to transmit a NULL ('\0')\r
- * terminated string. It transfers the text string, from the buffer starting at\r
- * the address pointed to by p_sz_string, into the UART\92s hardware transmitter\r
- * FIFO. It returns when the complete string has been transferred to the UART's\r
- * transmit FIFO. It is safe to release or reuse the memory used as the string\r
- * buffer once this function returns.\r
- *\r
- * Note:    This function reads the UART\92s line status register (LSR) to poll\r
- * for the active state of the transmitter holding register empty (THRE) bit\r
- * before transferring data from the data buffer to the transmitter FIFO. It\r
- * transfers data to the transmitter FIFO in blocks of 16 bytes or less and\r
- * allows the FIFO to empty before transferring the next block of data.\r
- *\r
- * Note:    The actual transmission over the serial connection will still be\r
- * in progress when this function returns. Use the UART_16550_get_tx_status()\r
- * function if you need to know when the transmitter is empty.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @param p_sz_string   The p_sz_string parameter is a pointer to a buffer\r
- *                      containing the NULL ('\0') terminated string to be\r
- *                      transmitted.\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- *   uint8_t testmsg1[] = {"\r\n\r\nUART_16550_polled_tx_string() test message 1\0"};\r
- *   UART_16550_polled_tx_string(&g_uart,(const uint8_t *)testmsg1);\r
- * @endcode\r
- */\r
-void\r
-UART_16550_polled_tx_string\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    const uint8_t * p_sz_string\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_irq_tx() function is used to initiate an interrupt driven\r
- * transmit. It returns immediately after making a note of the transmit buffer\r
- * location and enabling the transmitter holding register empty (THRE) interrupt\r
- * at the Core16550 level. This function takes a pointer via the pbuff parameter\r
- * to a memory buffer containing the data to transmit. The memory buffer\r
- * specified through this pointer must remain allocated and contain the data to\r
- * transmit until the transmit completion has been detected through calls to\r
- * function UART_16550_tx_complete().The actual transmission over the serial\r
- * connection is still in progress until calls to the UART_16550_tx_complete()\r
- * function indicate transmit completion.\r
- *\r
- * Note:    It is your responsibility to call UART_16550_isr(), the driver\92s\r
- * top level interrupt handler function, from the system level (CoreInterrupt\r
- * and NVIC level) interrupt handler assigned to the interrupt triggered by the\r
- * Core16550 INTR signal. You must do this before using the UART_16550_irq_tx()\r
- * function.\r
- *\r
- * Note:    It is also your responsibility to enable the system level\r
- * (CoreInterrupt and NVIC level) interrupt connected to the Core16550 INTR\r
- * interrupt signal.\r
- *\r
- * Note:    The UART_16550_irq_tx() function assigns an internal default transmit\r
- * interrupt handler function to the UART\92s THRE interrupt. This interrupt handler\r
- * overrides any custom interrupt handler that you may have previously registered\r
- * using the UART_16550_set_tx_handler() function.\r
- *\r
- * Note:    The UART_16550_irq_tx() function\92s default transmit interrupt handler\r
- * disables the UART\92s THRE interrupt when all of the data has been transferred\r
- * to the UART's transmit FIFO.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @param pbuff         The pbuff parameter is a pointer to a buffer containing\r
- *                      the data to be transmitted.\r
- * @param tx_size       The tx_size parameter specifies the size, in bytes, of\r
- *                      the data to be transmitted.\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- * uint8_t tx_buff[10] = "abcdefghi";\r
- *\r
- * UART_16550_irq_tx( &g_uart, tx_buff, sizeof(tx_buff));\r
- * while ( 0 == UART_16550_tx_complete( &g_uart ) )\r
- * { ; }\r
- * @endcode\r
- */\r
-void\r
-UART_16550_irq_tx\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    const uint8_t * pbuff,\r
-    uint32_t tx_size\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_tx_complete() function is used to find out if the interrupt\r
- * driven transmit previously initiated through a call to UART_16550_irq_tx()\r
- * is complete. This function is typically used to find out when it is safe\r
- * to reuse or release the memory buffer holding the transmit data.\r
- *\r
- * Note:    The transfer of all of the data from the memory buffer to the UART\92s\r
- * transmit FIFO and the actual transmission over the serial connection are both\r
- * complete when a call to the UART_16550_tx_complete() function indicate\r
- * transmit completion.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @return              This function returns a non-zero value if transmit has\r
- *                      completed, otherwise it returns zero.\r
- *  Example:\r
- *   See the UART_16550_irq_tx() function for an example that uses the\r
- *   UART_16550_tx_complete() function.\r
- */\r
-int8_t\r
-UART_16550_tx_complete\r
-(\r
-   uart_16550_instance_t * this_uart\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_get_rx() function reads the content of the Core16550\r
- * receiver\92s FIFO and stores it in the receive buffer that is passed via the\r
- * rx_buff function parameter. It copies either the full contents of the FIFO\r
- * into the receive buffer, or just enough data from the FIFO to fill the receive\r
- * buffer, dependent upon the size of the receive buffer passed by the buff_size\r
- * parameter. The UART_16550_get_rx() function returns the number of bytes copied\r
- * into the receive buffer .This function is non-blocking and will return 0\r
- * immediately if no data has been received.\r
- *\r
- * Note:    The UART_16550_get_rx() function reads and accumulates the receiver\r
- * status of the Core16550 instance before reading each byte from the receiver's\r
- * data register/FIFO. This allows the driver to maintain a sticky record of any\r
- * receiver errors that occur as the UART receives each data byte; receiver errors\r
- * would otherwise be lost after each read from the receiver's data register. A call\r
- * to the UART_16550_get_rx_status() function returns any receiver errors accumulated\r
- * during the execution of the UART_16550_get_rx() function.\r
- *\r
- * Note:    If you need to read the error status for each byte received, set the\r
- * buff_size to 1 and read the receive line error status for each byte using the\r
- * UART_16550_get_rx_status() function.\r
- * The UART_16550_get_rx() function can be used in polled mode, where it is called\r
- * at regular intervals to find out if any data has been received, or in interrupt\r
- * driven-mode, where it is called as part of a receive handler that is called by\r
- * the driver as a result of data being received.\r
- *\r
- * Note:    In interrupt driven mode you should call the UART_16550_get_rx()\r
- * function as part of the receive handler function that you register with the\r
- * Core16550 driver through a call to UART_16550_set_rx_handler().\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @param rx_buff       The rx_buff parameter is a pointer to a memory buffer\r
- *                      where the received data is copied.\r
- * @param buff_size     The buff_size parameter is the size of the receive\r
- *                      buffer in bytes.\r
- * @return              This function returns the number of bytes copied into\r
- *                      the receive buffer.\r
- * Example:\r
- * @code\r
- *   #define MAX_RX_DATA_SIZE    256\r
- *\r
- *   uint8_t rx_data[MAX_RX_DATA_SIZE];\r
- *   uint8_t rx_size = 0;\r
- *\r
- *   rx_size = UART_16550_get_rx( &g_uart, rx_data, sizeof(rx_data) );\r
- * @endcode\r
- */\r
-size_t\r
-UART_16550_get_rx\r
-(\r
-   uart_16550_instance_t * this_uart,\r
-   uint8_t * rx_buff,\r
-   size_t buff_size\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_isr() function is the top level interrupt handler function for\r
- * the Core16550 driver. You must call UART_16550_isr() from the system level\r
- * (CoreInterrupt and NVIC level) interrupt handler assigned to the interrupt\r
- * triggered by the Core16550 INTR signal. Your system level interrupt handler\r
- * must also clear the system level interrupt triggered by the Core16550 INTR\r
- * signal before returning, to prevent a re-assertion of the same interrupt.\r
- *\r
- * Note:    This function supports all types of interrupt triggered by Core16550.\r
- * It is not a complete interrupt handler by itself; rather, it is a top level\r
- * wrapper that abstracts Core16550 interrupt handling by calling lower level\r
- * handler functions specific to each type of Core16550 interrupt. You must\r
- * create the lower level handler functions to suit your application and\r
- * register them with the driver through calls to the UART_16550_set_rx_handler(),\r
- * UART_16550_set_tx_handler(), UART_16550_set_rxstatus_handler() and\r
- * UART_16550_set_modemstatus_handler() functions.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- *\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- *   void CIC_irq1_handler(void)\r
- *   {\r
- *      UART_16550_isr( &g_uart );\r
- *   }\r
- * @endcode\r
- */\r
-void\r
-UART_16550_isr\r
-(\r
-   uart_16550_instance_t * this_uart\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_set_rx_handler() function is used to register a receive handler\r
- * function that is called by the driver when a UART receive data available (RDA)\r
- * interrupt occurs. The UART_16550_set_rx_handler() function also enables the\r
- * RDA interrupt at the Core16550 level. You must create and register the receive\r
- * handler function to suit your application and it must include a call to the\r
- * UART_16550_get_rx() function to actually read the received data.\r
- *\r
- * Note:    The driver\92s top level interrupt handler function UART_16550_isr()\r
- * will call your receive handler function in response to an RDA interrupt from\r
- * the Core16550.\r
- *\r
- * Note:    You can disable the RDA interrupt once the data is received by calling\r
- * the UART_16550_disable_irq() function. This is your choice and is dependent\r
- * upon your application.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @param handler       The handler parameter is a pointer to a receive interrupt\r
- *                      handler function provided by your application that will be\r
- *                      called as a result of a UART RDA interrupt. This handler\r
- *                      function must be of type uart_16550_irq_handler_t.\r
- * @param trigger_level The trigger_level parameter is the receive FIFO\r
- *                      trigger level. This specifies the number of bytes that\r
- *                      must be received before the UART triggers an RDA\r
- *                      interrupt.\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- * #include "core_16550.h"\r
- *\r
- * #define RX_BUFF_SIZE    64\r
- * #define UART_57600_BAUD 26\r
- *\r
- * uint8_t g_rx_buff[RX_BUFF_SIZE];\r
- * uart_16550_instance_t g_uart;\r
- * void uart_rx_handler( uart_16550_instance_t * this_uart )\r
- * {\r
- *     UART_16550_get_rx( this_uart, g_rx_buff, RX_BUFF_SIZE );\r
- * }\r
- *\r
- * int main(void)\r
- * {\r
- *     UART_16550_init( &g_uart, UART_57600_BAUD,\r
- *                       ( UART_16550_DATA_8_BITS | UART_16550_NO_PARITY ) );\r
- *     UART_16550_set_rx_handler( &g_uart, uart_rx_handler,\r
- *                                UART_16550_FIFO_SINGLE_BYTE);\r
- *     while ( 1 )\r
- *     {\r
- *         ;\r
- *     }\r
- *     return(0);\r
- * }\r
- * @endcode\r
- */\r
-void\r
-UART_16550_set_rx_handler\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uart_16550_irq_handler_t handler,\r
-    uart_16550_rx_trig_level_t trigger_level\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_set_loopback() function is used to locally loopback the Tx\r
- * and Rx lines of a Core16550 UART.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @param loopback      The loopback parameter indicates whether or not the\r
- *                      UART's transmit and receive lines should be looped back.\r
- *                      Allowed values are as follows:\r
- *                      \95   UART_16550_LOOPBACK_ON\r
- *                      \95   UART_16550_LOOPBACK_OFF\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- * #include "core_16550.h"\r
- *\r
- * #define UART_57600_BAUD 26\r
- * #define DATA_SIZE 4\r
- *\r
- * uart_16550_instance_t g_uart;\r
- *\r
- * int main(void)\r
- * {\r
- *      uint8_t txbuf[DATA_SIZE] = "abc";\r
- *      uint8_t rxbuf[DATA_SIZE];\r
- *      UART_16550_init( &g_uart, UART_57600_BAUD,\r
- *                        ( UART_16550_DATA_8_BITS | UART_16550_NO_PARITY |\r
- *                                               UART_16550_ONE_STOP_BIT) );\r
- *      UART_16550_set_loopback( &g_uart, UART_16550_LOOPBACK_ON );\r
- *\r
- *      while(1)\r
- *      {\r
- *          UART_16550_polled_tx( &g_uart, txbuf, DATA_SIZE);\r
- *          delay(100);\r
- *          UART_16550_get_rx( &g_uart, rxbuf, DATA_SIZE);\r
- *      }\r
- * }\r
- * @endcode\r
- */\r
-void\r
-UART_16550_set_loopback\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uart_16550_loopback_t loopback\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_get_rx_status() function returns the receiver error status of\r
- * the Core16550 instance. It reads both the current error status of the receiver\r
- * from the UART\92s line status register (LSR) and the accumulated error status\r
- * from preceding calls to the UART_16550_get_rx() function, and it combines\r
- * them using a bitwise OR. It returns the cumulative overrun, parity, framing,\r
- * break and FIFO error status of the receiver, since the previous call to\r
- * UART_16550_get_rx_status(), as an 8-bit encoded value.\r
- *\r
- * Note:    The UART_16550_get_rx() function reads and accumulates the receiver\r
- * status of the Core16550 instance before reading each byte from the receiver\92s\r
- * data register/FIFO. The driver maintains a sticky record of the cumulative\r
- * receiver error status, which persists after the UART_16550_get_rx() function\r
- * returns. The UART_16550_get_rx_status() function clears the driver\92s sticky\r
- * receiver error record before returning.\r
- *\r
- * Note:    The driver\92s transmit functions also read the line status register\r
- * (LSR) as part of their implementation. When the driver reads the LSR, the\r
- * UART clears any active receiver error bits in the LSR. This could result in\r
- * the driver losing receiver errors. To avoid any loss of receiver errors, the\r
- * transmit functions also update the driver\92s sticky record of the cumulative\r
- * receiver error status whenever they read the LSR.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @return              This function returns the UART\92s receiver error status\r
- *                      as an 8-bit unsigned integer. The returned value is 0\r
- *                      if no receiver errors occurred. The driver provides a\r
- *                      set of bit mask constants that should be compared with\r
- *                      and/or used to mask the returned value to determine the\r
- *                      receiver error status.\r
- *                      When the return value is compared to the following bit\r
- *                      masks, a non-zero result indicates that the\r
- *                      corresponding error occurred:\r
- *                      \95   UART_16550_OVERRUN_ERROR    (bit mask = 0x02)\r
- *                      \95   UART_16550_PARITY_ERROR     (bit mask = 0x04)\r
- *                      \95   UART_16550_FRAMING_ERROR    (bit mask = 0x08)\r
- *                      \95   UART_16550_BREAK_ERROR      (bit mask = 0x10)\r
- *                      \95   UART_16550_FIFO_ERROR       (bit mask = 0x80)\r
- *                      When the return value is compared to the following bit\r
- *                      mask, a non-zero result indicates that no error occurred:\r
- *                      \95   UART_16550_NO_ERROR         (bit mask = 0x00)\r
- *                      Upon unsuccessful execution, this function returns:\r
- *                      \95   UART_16550_INVALID_PARAM    (bit mask = 0xFF)\r
- *\r
- * Example:\r
- * @code\r
- *   uart_16550_instance_t g_uart;\r
- *   uint8_t rx_data[MAX_RX_DATA_SIZE];\r
- *   uint8_t err_status;\r
- *\r
- *   err_status = UART_16550_get_rx_status(&g_uart);\r
- *   if(UART_16550_NO_ERROR == err_status )\r
- *   {\r
- *        rx_size = UART_16550_get_rx( &g_uart, rx_data, MAX_RX_DATA_SIZE );\r
- *   }\r
- * @endcode\r
- */\r
-uint8_t\r
-UART_16550_get_rx_status\r
-(\r
-    uart_16550_instance_t * this_uart\r
-);\r
-/***************************************************************************//**\r
- * The UART_16550_enable_irq() function enables the Core16550 interrupts\r
- * specified by the irq_mask parameter. The irq_mask parameter identifies the\r
- * Core16550 interrupts by bit position, as defined in the interrupt enable\r
- * register (IER) of Core16550. The Core16550 interrupts and their identifying\r
- * irq_mask bit positions are as follows:\r
- *      \95   Receive data available interrupt (RDA)      (irq_mask bit 0)\r
- *      \95   Transmit holding register empty interrupt (THRE)    (irq_mask bit 1)\r
- *      \95   Receiver line status interrupt (LS)         (irq_mask bit 2)\r
- *      \95   Modem status interrupt (MS)         (irq_mask bit 3)\r
- * When an irq_mask bit position is set to 1, this function enables the\r
- * corresponding Core16550 interrupt in the IER register. When an irq_mask\r
- * bit position is set to 0, the corresponding interrupt\92s state remains\r
- * unchanged in the IER register.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @param irq_mask      The irq_mask parameter is used to select which of the\r
- *                      Core16550\92s interrupts you want to enable. The allowed\r
- *                      value for the irq_mask parameter is one of the\r
- *                      following constants or a bitwise OR of more than one:\r
- *                      \95   UART_16550_RBF_IRQ      (bit mask = 0x01)\r
- *                      \95   UART_16550_TBE_IRQ      (bit mask = 0x02)\r
- *                      \95   UART_16550_LS_IRQ       (bit mask = 0x04)\r
- *                      \95   UART_16550_MS_IRQ       (bit mask = 0x08)\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- *   UART_16550_enable_irq( &g_uart,( UART_16550_RBF_IRQ | UART_16550_TBE_IRQ ) );\r
- * @endcode\r
- */\r
-void\r
-UART_16550_enable_irq\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uint8_t irq_mask\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_disable_irq() function disables the Core16550 interrupts\r
- * specified by the irq_mask parameter. The irq_mask parameter identifies the\r
- * Core16550 interrupts by bit position, as defined in the interrupt enable\r
- * register (IER) of Core16550. The Core16550 interrupts and their identifying\r
- * bit positions are as follows:\r
- *      \95   Receive data available interrupt (RDA)              (irq_mask bit 0)\r
- *      \95   Transmit holding register empty interrupt (THRE)    (irq_mask bit 1)\r
- *      \95   Receiver line status interrupt (LS)                 (irq_mask bit 2)\r
- *      \95   Modem status interrupt (MS)                         (irq_mask bit 3)\r
- * When an irq_mask bit position is set to 1, this function disables the\r
- * corresponding Core16550 interrupt in the IER register. When an irq_mask bit\r
- * position is set to 0, the corresponding interrupt\92s state remains unchanged\r
- * in the IER register.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @param irq_mask      The irq_mask parameter is used to select which of the\r
- *                      Core16550\92s interrupts you want to disable. The allowed\r
- *                      value for the irq_mask parameter is one of the\r
- *                      following constants or a bitwise OR of more than one:\r
- *                      \95   UART_16550_RBF_IRQ      (bit mask = 0x01)\r
- *                      \95   UART_16550_TBE_IRQ      (bit mask = 0x02)\r
- *                      \95   UART_16550_LS_IRQ       (bit mask = 0x04)\r
- *                      \95   UART_16550_MS_IRQ       (bit mask = 0x08)\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- *   UART_16550_disable_irq( &g_uart, ( UART_16550_RBF_IRQ | UART_16550_TBE_IRQ ) );\r
- * @endcode\r
- */\r
-void\r
-UART_16550_disable_irq\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uint8_t irq_mask\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_get_modem_status() function returns the modem status of the\r
- * Core16550 instance. It reads the modem status register (MSR) and returns the\r
- * 8 bit value. The bit encoding of the returned value is exactly the same as\r
- * the definition of the bits in the MSR.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @return              This function returns current state of the UART's MSR\r
- *                      as an 8 bit unsigned integer. The driver provides the\r
- *                      following set of bit mask constants that should be\r
- *                      compared with and/or used to mask the returned value\r
- *                      to determine the modem status:\r
- *                      \95   UART_16550_DCTS (bit mask = 0x01)\r
- *                      \95   UART_16550_DDSR (bit mask = 0x02)\r
- *                      \95   UART_16550_TERI (bit mask = 0x04)\r
- *                      \95   UART_16550_DDCD (bit mask = 0x08)\r
- *                      \95   UART_16550_CTS  (bit mask = 0x10)\r
- *                      \95   UART_16550_DSR  (bit mask = 0x20)\r
- *                      \95   UART_16550_RI   (bit mask = 0x40)\r
- *                      \95   UART_16550_DCD  (bit mask = 0x80)\r
- * Example:\r
- * @code\r
- *   void uart_modem_status_isr(uart_16550_instance_t * this_uart)\r
- *   {\r
- *      uint8_t status;\r
- *      status = UART_16550_get_modem_status( this_uart );\r
- *      if( status & UART_16550_DCTS )\r
- *      {\r
- *          uart_dcts_handler();\r
- *      }\r
- *      if( status & UART_16550_CTS )\r
- *      {\r
- *          uart_cts_handler();\r
- *      }\r
- *   }\r
- * @endcode\r
- */\r
-uint8_t\r
-UART_16550_get_modem_status\r
-(\r
-    uart_16550_instance_t * this_uart\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_set_rxstatus_handler() function is used to register a receiver\r
- * status handler function that is called by the driver when a UART receiver\r
- * line status (RLS) interrupt occurs. The UART_16550_set_rxstatus_handler()\r
- * function also enables the RLS interrupt at the Core16550 level. You must\r
- * create and register the receiver status handler function to suit your\r
- * application.\r
- *\r
- * Note:    The driver\92s top level interrupt handler function UART_16550_isr()\r
- * will call your receive status handler function in response to an RLS\r
- * interrupt from the Core16550.\r
- *\r
- * Note:    You can disable the RLS interrupt when required by calling the\r
- * UART_16550_disable_irq() function. This is your choice and is dependent\r
- * upon your application.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @param handler       The handler parameter is a pointer to a receiver line\r
- *                      status interrupt handler function provided by your\r
- *                      application that will be called as a result of a\r
- *                      UART RLS interrupt. This handler function must be\r
- *                      of type uart_16550_irq_handler_t.\r
- * Example:\r
- * @code\r
- * #include "core_16550.h"\r
- *\r
- * #define UART_57600_BAUD 26\r
- *\r
- * uart_16550_instance_t g_uart;\r
- *\r
- * void uart_rxsts_handler( uart_16550_instance_t * this_uart )\r
- * {\r
- *      uint8_t status;\r
- *      status = UART_16550_get_rx_status( this_uart );\r
- *      if( status & UART_16550_OVERUN_ERROR )\r
- *      {\r
- *          discard_rx_data();\r
- *      }\r
- * }\r
- *\r
- * int main(void)\r
- * {\r
- *     UART_16550_init( &g_uart, UART_57600_BAUD,\r
- *                      UART_16550_DATA_8_BITS | UART_16550_NO_PARITY |\r
- *                                             UART_16550_ONE_STOP_BIT );\r
- *     UART_16550_set_rxstatus_handler( &g_uart, uart_rxsts_handler );\r
- *\r
- *     while ( 1 )\r
- *     {\r
- *         ;\r
- *     }\r
- *     return(0);\r
- * }\r
- * @endcode\r
- */\r
-void\r
-UART_16550_set_rxstatus_handler\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uart_16550_irq_handler_t handler\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_set_tx_handler() function is used to register a transmit\r
- * handler function that is called by the driver when a UART transmit holding\r
- * register empty (THRE) interrupt occurs. The UART_16550_set_tx_handler()\r
- * function also enables the THRE interrupt at the Core16550 level. You must\r
- * create and register the transmit handler function to suit your application.\r
- * You can use the UART_16550_fill_tx_fifo() function in your transmit handler\r
- * function to write data to the transmitter.\r
- *\r
- * Note:    The driver\92s top level interrupt handler function UART_16550_isr()\r
- * will call your transmit handler function in response to an THRE interrupt\r
- * from the Core16550.\r
- *\r
- * Note:    You can disable the THRE interrupt when required by calling the\r
- * UART_16550_disable_irq() function. This is your choice and is dependent\r
- * upon your application.\r
- *\r
- * Note:    The UART_16550_irq_tx() function does not use the transmit handler\r
- * function that you register with the UART_16550_set_tx_handler() function.\r
- * It uses its own internal THRE interrupt handler function that overrides any\r
- * custom interrupt handler that you register using the\r
- * UART_16550_set_tx_handler() function.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @param handler       The handler parameter is a pointer to a transmitter\r
- *                      interrupt handler function provided by your application,\r
- *                      which will be called as a result of a UART THRE interrupt.\r
- *                      This handler is of uart_16550_irq_handler_t type.\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- * #include "core_16550.h"\r
- *\r
- * #define UART_57600_BAUD 26\r
- *\r
- * uart_16550_instance_t g_uart;\r
- *\r
- * uint8_t * g_tx_buffer;\r
- * size_t g_tx_size = 0;\r
- *\r
- * void uart_tx_handler( uart_16550_instance_t * this_uart )\r
- * {\r
- *      size_t size_in_fifo;\r
- *\r
- *      size_in_fifo = UART_16550_fill_tx_fifo( this_uart,\r
- *                                              (const uint8_t *)g_tx_buffer,\r
- *                                              g_tx_size );\r
- *\r
- *      if(size_in_fifo == g_tx_size)\r
- *      {\r
- *         g_tx_size = 0;\r
- *         UART_16550_disable_irq( this_uart, UART_16550_TBE_IRQ );\r
- *      }\r
- *      else\r
- *      {\r
- *         g_tx_buffer = &g_tx_buffer[size_in_fifo];\r
- *         g_tx_size = g_tx_size - size_in_fifo;\r
- *      }\r
- *  }\r
- *\r
- *  int main(void)\r
- *  {\r
- *      uint8_t message[12] = "Hello world";\r
- *\r
- *      UART_16550_init( &g_uart, UART_57600_BAUD,\r
- *                       UART_16550_DATA_8_BITS | UART_16550_NO_PARITY |\r
- *                                            UART_16550_ONE_STOP_BIT );\r
- *\r
- *      g_tx_buffer = message;\r
- *      g_tx_size = sizeof(message);\r
- *\r
- *      UART_16550_set_tx_handler( &g_uart, uart_tx_handler);\r
- *\r
- *      while ( 1 )\r
- *      {\r
- *          ;\r
- *      }\r
- *      return(0);\r
- *  }\r
- *\r
- * @endcode\r
- */\r
-void\r
-UART_16550_set_tx_handler\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uart_16550_irq_handler_t handler\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_set_modemstatus_handler() function is used to register a\r
- * modem status handler function that is called by the driver when a UART modem\r
- * status (MS) interrupt occurs. The UART_16550_set_modemstatus_handler()\r
- * function also enables the MS interrupt at the Core16550 level. You must\r
- * create and register the modem status handler function to suit your\r
- * application.\r
- *\r
- * Note:    The driver\92s top level interrupt handler function UART_16550_isr()\r
- * will call your receive status handler function in response to an MS interrupt\r
- * from the Core16550.\r
- *\r
- * Note:    You can disable the MS interrupt when required by calling the\r
- * UART_16550_disable_irq() function. This is your choice and is dependent\r
- * upon your application.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @param handler       The handler parameter is a pointer to a modem status\r
- *                      interrupt handler function provided by your application\r
- *                      that will be called as a result of a UART MS interrupt.\r
- *                      This handler function must be of type\r
- *                      uart_16550_irq_handler_t.\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- * #include "core_16550.h"\r
- *\r
- * #define UART_57600_BAUD 26\r
- *\r
- * uart_16550_instance_t g_uart;\r
- *\r
- * void uart_modem_handler( uart_16550_instance_t * this_uart )\r
- * {\r
- *      uint8_t status;\r
- *      status = UART_16550_get_modem_status( this_uart );\r
- *      if( status & UART_16550_CTS )\r
- *      {\r
- *          uart_cts_handler();\r
- *      }\r
- * }\r
- *\r
- * int main(void)\r
- * {\r
- *     UART_16550_init( &g_uart, UART_57600_BAUD,\r
- *                      UART_16550_DATA_8_BITS | UART_16550_NO_PARITY |\r
-                                              UART_16550_ONE_STOP_BIT);\r
- *     UART_16550_set_modemstatus_handler( &g_uart, uart_modem_handler);\r
- *\r
- *     while ( 1 )\r
- *     {\r
- *         ;\r
- *     }\r
- *     return(0);\r
- * }\r
- * @endcode\r
- */\r
-void\r
-UART_16550_set_modemstatus_handler\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    uart_16550_irq_handler_t handler\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_fill_tx_fifo() function fills the UART's hardware transmitter\r
- * FIFO with the data found in the transmitter buffer that is passed via the\r
- * tx_buffer function parameter. If the transmitter FIFO is not empty when the\r
- * function is called, the function returns immediately without transferring\r
- * any data to the FIFO; otherwise, the function transfers data from the\r
- * transmitter buffer to the FIFO until it is full or until the complete\r
- * contents of the transmitter buffer have been copied into the FIFO. The\r
- * function returns the number of bytes copied into the UART's transmitter FIFO.\r
- *\r
- * Note:    This function reads the UART\92s line status register (LSR) to check\r
- * for the active state of the transmitter holding register empty (THRE) bit\r
- * before transferring data from the data buffer to the transmitter FIFO. If\r
- * THRE is 0, the function returns immediately, without transferring any data\r
- * to the FIFO. If THRE is 1, the function transfers up to 16 bytes of data to\r
- * the FIFO and then returns.\r
- *\r
- * Note:    The actual transmission over the serial connection will still be in\r
- * progress when this function returns. Use the UART_16550_get_tx_status()\r
- * function if you need to know when the transmitter is empty.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @param tx_buffer     The tx_buffer parameter is a pointer to a buffer\r
- *                      containing the data to be transmitted.\r
- * @param tx_size       The tx_size parameter is the size in bytes, of the data\r
- *                      to be transmitted.\r
- * @return              This function returns the number of bytes copied\r
- *                      into the UART's transmitter FIFO.\r
- *\r
- * Example:\r
- * @code\r
- *   void send_using_interrupt(uint8_t * pbuff, size_t tx_size)\r
- *   {\r
- *       size_t size_in_fifo;\r
- *       size_in_fifo = UART_16550_fill_tx_fifo( &g_uart, pbuff, tx_size );\r
- *   }\r
- * @endcode\r
- */\r
-size_t\r
-UART_16550_fill_tx_fifo\r
-(\r
-    uart_16550_instance_t * this_uart,\r
-    const uint8_t * tx_buffer,\r
-    size_t tx_size\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_16550_get_tx_status() function returns the transmitter status of\r
- * the Core16550 instance. It reads both the UART\92s line status register (LSR)\r
- * and returns the status of the transmit holding register empty (THRE) and\r
- * transmitter empty (TEMT) bits.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a\r
- *                      uart_16550_instance_t structure that holds all data\r
- *                      regarding this instance of the Core16550.\r
- * @return              This function returns the UART\92s transmitter status\r
- *                      as an 8-bit unsigned integer. The returned value is 0\r
- *                      if the transmitter status bits are not set or the\r
- *                      function execution failed. The driver provides a set\r
- *                      of bit mask constants that should be compared with\r
- *                      and/or used to mask the returned value to determine\r
- *                      the transmitter status.\r
- *                      When the return value is compared to the following\r
- *                      bitmasks, a non-zero result indicates that the\r
- *                      corresponding transmitter status bit is set:\r
- *                      \95   UART_16550_THRE     (bit mask = 0x20)\r
- *                      \95   UART_16550_TEMT     (bit mask = 0x40)\r
- *                      When the return value is compared to the following\r
- *                      bit mask, a non-zero result indicates that the\r
- *                      transmitter is busy or the function execution failed.\r
- *                      \95   UART_16550_TX_BUSY      (bit mask = 0x00)\r
- * Example:\r
- * @code\r
- *   uint8_t tx_buff[10] = "abcdefghi";\r
- *\r
- *   UART_16550_polled_tx( &g_uart, tx_buff, sizeof(tx_buff));\r
- *\r
- *   while ( ! (UART_16550_TEMT & UART_16550_get_tx_status( &g_uart ) )  )\r
- *   {\r
- *      ;\r
- *   }\r
- * @endcode\r
- */\r
-uint8_t\r
-UART_16550_get_tx_status\r
-(\r
-    uart_16550_instance_t * this_uart\r
-);\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif /* __CORE_16550_H */\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreGPIO/core_gpio.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreGPIO/core_gpio.c
deleted file mode 100644 (file)
index e5dbd7e..0000000
+++ /dev/null
@@ -1,461 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2008-2015 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * CoreGPIO bare metal driver implementation.\r
- *\r
- * SVN $Revision: 7964 $\r
- * SVN $Date: 2015-10-09 18:26:53 +0530 (Fri, 09 Oct 2015) $\r
- */\r
-#include "core_gpio.h"\r
-#include "hal.h"\r
-#include "hal_assert.h"\r
-#include "coregpio_regs.h"\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- *\r
- */\r
-#define GPIO_INT_ENABLE_MASK        (uint32_t)0x00000008UL\r
-#define OUTPUT_BUFFER_ENABLE_MASK   0x00000004UL\r
-\r
-\r
-#define NB_OF_GPIO  32\r
-\r
-#define CLEAR_ALL_IRQ32     (uint32_t)0xFFFFFFFF\r
-#define CLEAR_ALL_IRQ16     (uint16_t)0xFFFF\r
-#define CLEAR_ALL_IRQ8      (uint8_t)0xFF\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * GPIO_init()\r
- * See "core_gpio.h" for details of how to use this function.\r
- */\r
-void GPIO_init\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    addr_t              base_addr,\r
-    gpio_apb_width_t    bus_width\r
-)\r
-{\r
-    uint8_t i = 0;\r
-    addr_t cfg_reg_addr = base_addr;\r
-    \r
-    this_gpio->base_addr = base_addr;\r
-    this_gpio->apb_bus_width = bus_width;\r
-    \r
-    /* Clear configuration. */\r
-    for( i = 0, cfg_reg_addr = base_addr; i < NB_OF_GPIO; ++i )\r
-    {\r
-        HW_set_8bit_reg( cfg_reg_addr, 0 );\r
-        cfg_reg_addr += 4;\r
-    }\r
-    /* Clear any pending interrupts */\r
-    switch( this_gpio->apb_bus_width )\r
-    {\r
-        case GPIO_APB_32_BITS_BUS:\r
-            HAL_set_32bit_reg( this_gpio->base_addr, IRQ, CLEAR_ALL_IRQ32 );\r
-            break;\r
-            \r
-        case GPIO_APB_16_BITS_BUS:\r
-            HAL_set_16bit_reg( this_gpio->base_addr, IRQ0, (uint16_t)CLEAR_ALL_IRQ16 );\r
-            HAL_set_16bit_reg( this_gpio->base_addr, IRQ1, (uint16_t)CLEAR_ALL_IRQ16 );\r
-            break;\r
-            \r
-        case GPIO_APB_8_BITS_BUS:\r
-            HAL_set_8bit_reg( this_gpio->base_addr, IRQ0, (uint8_t)CLEAR_ALL_IRQ8 );\r
-            HAL_set_8bit_reg( this_gpio->base_addr, IRQ1, (uint8_t)CLEAR_ALL_IRQ8 );\r
-            HAL_set_8bit_reg( this_gpio->base_addr, IRQ2, (uint8_t)CLEAR_ALL_IRQ8 );\r
-            HAL_set_8bit_reg( this_gpio->base_addr, IRQ3, (uint8_t)CLEAR_ALL_IRQ8 );\r
-            break;\r
-            \r
-        default:\r
-            HAL_ASSERT(0);\r
-            break;\r
-    }\r
-}\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * GPIO_config\r
- * See "core_gpio.h" for details of how to use this function.\r
- */\r
-void GPIO_config\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    gpio_id_t           port_id,\r
-    uint32_t            config\r
-)\r
-{\r
-    HAL_ASSERT( port_id < NB_OF_GPIO );\r
-    \r
-    if ( port_id < NB_OF_GPIO )\r
-    {\r
-        uint32_t cfg_reg_addr = this_gpio->base_addr;\r
-        cfg_reg_addr += (port_id * 4);\r
-        HW_set_32bit_reg( cfg_reg_addr, config );\r
-        \r
-        /*\r
-         * Verify that the configuration was correctly written. Failure to read\r
-         * back the expected value may indicate that the GPIO port was configured\r
-         * as part of the hardware flow and cannot be modified through software.\r
-         * It may also indicate that the base address passed as parameter to\r
-         * GPIO_init() was incorrect.\r
-         */\r
-        HAL_ASSERT( HW_get_32bit_reg( cfg_reg_addr ) == config );\r
-    }\r
-}\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * GPIO_set_outputs\r
- * See "core_gpio.h" for details of how to use this function.\r
- */\r
-void GPIO_set_outputs\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    uint32_t            value\r
-)\r
-{\r
-    switch( this_gpio->apb_bus_width )\r
-    {\r
-        case GPIO_APB_32_BITS_BUS:\r
-            HAL_set_32bit_reg( this_gpio->base_addr, GPIO_OUT, value );\r
-            break;\r
-            \r
-        case GPIO_APB_16_BITS_BUS:\r
-            HAL_set_16bit_reg( this_gpio->base_addr, GPIO_OUT0, (uint16_t)value );\r
-            HAL_set_16bit_reg( this_gpio->base_addr, GPIO_OUT1, (uint16_t)(value >> 16) );\r
-            break;\r
-            \r
-        case GPIO_APB_8_BITS_BUS:\r
-            HAL_set_8bit_reg( this_gpio->base_addr, GPIO_OUT0, (uint8_t)value );\r
-            HAL_set_8bit_reg( this_gpio->base_addr, GPIO_OUT1, (uint8_t)(value >> 8) );\r
-            HAL_set_8bit_reg( this_gpio->base_addr, GPIO_OUT2, (uint8_t)(value >> 16) );\r
-            HAL_set_8bit_reg( this_gpio->base_addr, GPIO_OUT3, (uint8_t)(value >> 24) );\r
-            break;\r
-            \r
-        default:\r
-            HAL_ASSERT(0);\r
-            break;\r
-    }\r
-    \r
-    /*\r
-     * Verify that the output register was correctly written. Failure to read back\r
-     * the expected value may indicate that some of the GPIOs may not exist due to\r
-     * the number of GPIOs selected in the CoreGPIO hardware flow configuration.\r
-     * It may also indicate that the base address or APB bus width passed as\r
-     * parameter to the GPIO_init() function do not match the hardware design.\r
-     */\r
-    HAL_ASSERT( GPIO_get_outputs( this_gpio ) == value );\r
-}\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * GPIO_get_inputs\r
- * See "core_gpio.h" for details of how to use this function.\r
- */\r
-uint32_t GPIO_get_inputs\r
-(\r
-    gpio_instance_t *   this_gpio\r
-)\r
-{\r
-    uint32_t gpio_in = 0;\r
-    \r
-    switch( this_gpio->apb_bus_width )\r
-    {\r
-        case GPIO_APB_32_BITS_BUS:\r
-            gpio_in = HAL_get_32bit_reg( this_gpio->base_addr, GPIO_IN );\r
-            break;\r
-            \r
-        case GPIO_APB_16_BITS_BUS:\r
-            gpio_in |= HAL_get_16bit_reg( this_gpio->base_addr, GPIO_IN0 );\r
-            gpio_in |= (HAL_get_16bit_reg( this_gpio->base_addr, GPIO_IN1 ) << 16);\r
-            break;\r
-            \r
-        case GPIO_APB_8_BITS_BUS:\r
-            gpio_in |= HAL_get_8bit_reg( this_gpio->base_addr, GPIO_IN0 );\r
-            gpio_in |= (HAL_get_8bit_reg( this_gpio->base_addr, GPIO_IN1 ) << 8);\r
-            gpio_in |= (HAL_get_8bit_reg( this_gpio->base_addr, GPIO_IN2 ) << 16);\r
-            gpio_in |= (HAL_get_8bit_reg( this_gpio->base_addr, GPIO_IN3 ) << 24);\r
-            break;\r
-            \r
-        default:\r
-            HAL_ASSERT(0);\r
-            break;\r
-    }\r
-    \r
-    return gpio_in;\r
-}\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * GPIO_get_outputs\r
- * See "core_gpio.h" for details of how to use this function.\r
- */\r
-uint32_t GPIO_get_outputs\r
-(\r
-    gpio_instance_t *   this_gpio\r
-)\r
-{\r
-    uint32_t gpio_out = 0;\r
-    \r
-    switch( this_gpio->apb_bus_width )\r
-    {\r
-        case GPIO_APB_32_BITS_BUS:\r
-            gpio_out = HAL_get_32bit_reg( this_gpio->base_addr, GPIO_OUT );\r
-            break;\r
-            \r
-        case GPIO_APB_16_BITS_BUS:\r
-            gpio_out |= HAL_get_16bit_reg( this_gpio->base_addr, GPIO_OUT0 );\r
-            gpio_out |= (HAL_get_16bit_reg( this_gpio->base_addr, GPIO_OUT1 ) << 16);\r
-            break;\r
-            \r
-        case GPIO_APB_8_BITS_BUS:\r
-            gpio_out |= HAL_get_16bit_reg( this_gpio->base_addr, GPIO_OUT0 );\r
-            gpio_out |= (HAL_get_16bit_reg( this_gpio->base_addr, GPIO_OUT1 ) << 8);\r
-            gpio_out |= (HAL_get_16bit_reg( this_gpio->base_addr, GPIO_OUT2 ) << 16);\r
-            gpio_out |= (HAL_get_16bit_reg( this_gpio->base_addr, GPIO_OUT3 ) << 24);\r
-            break;\r
-            \r
-        default:\r
-            HAL_ASSERT(0);\r
-            break;\r
-    }\r
-    \r
-    return gpio_out;\r
-}\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * GPIO_set_output\r
- * See "core_gpio.h" for details of how to use this function.\r
- */\r
-void GPIO_set_output\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    gpio_id_t           port_id,\r
-    uint8_t             value\r
-)\r
-{\r
-    HAL_ASSERT( port_id < NB_OF_GPIO );\r
-    \r
-            \r
-    switch( this_gpio->apb_bus_width )\r
-    {\r
-        case GPIO_APB_32_BITS_BUS:\r
-            {\r
-                uint32_t outputs_state;\r
-                \r
-                outputs_state = HAL_get_32bit_reg( this_gpio->base_addr, GPIO_OUT );\r
-                if ( 0 == value )\r
-                {\r
-                    outputs_state &= ~(1 << port_id);\r
-                }\r
-                else\r
-                {\r
-                    outputs_state |= 1 << port_id;\r
-                }\r
-                HAL_set_32bit_reg( this_gpio->base_addr, GPIO_OUT, outputs_state );\r
-                \r
-                /*\r
-                 * Verify that the output register was correctly written. Failure to read back\r
-                 * the expected value may indicate that some of the GPIOs may not exist due to\r
-                 * the number of GPIOs selected in the CoreGPIO hardware flow configuration.\r
-                 * It may also indicate that the base address or APB bus width passed as\r
-                 * parameter to the GPIO_init() function do not match the hardware design.\r
-                 */\r
-                HAL_ASSERT( HAL_get_32bit_reg( this_gpio->base_addr, GPIO_OUT ) == outputs_state );\r
-            }\r
-            break;\r
-            \r
-        case GPIO_APB_16_BITS_BUS:\r
-            {\r
-                uint16_t outputs_state;\r
-                uint32_t gpio_out_reg_addr = this_gpio->base_addr + GPIO_OUT_REG_OFFSET + ((port_id >> 4) * 4);\r
-                \r
-                outputs_state = HW_get_16bit_reg( gpio_out_reg_addr );\r
-                if ( 0 == value )\r
-                {\r
-                    outputs_state &= ~(1 << (port_id & 0x0F));\r
-                }\r
-                else\r
-                {\r
-                    outputs_state |= 1 << (port_id & 0x0F);\r
-                }\r
-                HW_set_16bit_reg( gpio_out_reg_addr, outputs_state );\r
-                \r
-                /*\r
-                 * Verify that the output register was correctly written. Failure to read back\r
-                 * the expected value may indicate that some of the GPIOs may not exist due to\r
-                 * the number of GPIOs selected in the CoreGPIO hardware flow configuration.\r
-                 * It may also indicate that the base address or APB bus width passed as\r
-                 * parameter to the GPIO_init() function do not match the hardware design.\r
-                 */\r
-                HAL_ASSERT( HW_get_16bit_reg( gpio_out_reg_addr ) == outputs_state );\r
-            }\r
-            break;\r
-            \r
-        case GPIO_APB_8_BITS_BUS:\r
-            {\r
-                uint8_t outputs_state;\r
-                uint32_t gpio_out_reg_addr = this_gpio->base_addr + GPIO_OUT_REG_OFFSET + ((port_id >> 3) * 4);\r
-                \r
-                outputs_state = HW_get_8bit_reg( gpio_out_reg_addr );\r
-                if ( 0 == value )\r
-                {\r
-                    outputs_state &= ~(1 << (port_id & 0x07));\r
-                }\r
-                else\r
-                {\r
-                    outputs_state |= 1 << (port_id & 0x07);\r
-                }\r
-                HW_set_8bit_reg( gpio_out_reg_addr, outputs_state );\r
-                \r
-                /*\r
-                 * Verify that the output register was correctly written. Failure to read back\r
-                 * the expected value may indicate that some of the GPIOs may not exist due to\r
-                 * the number of GPIOs selected in the CoreGPIO hardware flow configuration.\r
-                 * It may also indicate that the base address or APB bus width passed as\r
-                 * parameter to the GPIO_init() function do not match the hardware design.\r
-                 */\r
-                HAL_ASSERT( HW_get_8bit_reg( gpio_out_reg_addr ) == outputs_state );\r
-            }\r
-            break;\r
-            \r
-        default:\r
-            HAL_ASSERT(0);\r
-            break;\r
-    }\r
-}\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * GPIO_drive_inout\r
- * See "core_gpio.h" for details of how to use this function.\r
- */\r
-void GPIO_drive_inout\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    gpio_id_t           port_id,\r
-    gpio_inout_state_t  inout_state\r
-)\r
-{\r
-    uint32_t config;\r
-    uint32_t cfg_reg_addr = this_gpio->base_addr;\r
-    \r
-    HAL_ASSERT( port_id < NB_OF_GPIO );\r
-\r
-    switch( inout_state )\r
-    {\r
-        case GPIO_DRIVE_HIGH:\r
-            /* Set output high */\r
-            GPIO_set_output( this_gpio, port_id, 1 );\r
-            \r
-            /* Enable output buffer */\r
-            cfg_reg_addr = this_gpio->base_addr + (port_id * 4);\r
-            config = HW_get_8bit_reg( cfg_reg_addr );\r
-            config |= OUTPUT_BUFFER_ENABLE_MASK;\r
-            HW_set_8bit_reg( cfg_reg_addr, config );\r
-            break;\r
-            \r
-        case GPIO_DRIVE_LOW:\r
-            /* Set output low */\r
-            GPIO_set_output( this_gpio, port_id, 0 );\r
-            \r
-            /* Enable output buffer */\r
-            cfg_reg_addr = this_gpio->base_addr + (port_id * 4);\r
-            config = HW_get_8bit_reg( cfg_reg_addr );\r
-            config |= OUTPUT_BUFFER_ENABLE_MASK;\r
-            HW_set_8bit_reg( cfg_reg_addr, config );\r
-            break;\r
-            \r
-        case GPIO_HIGH_Z:\r
-            /* Disable output buffer */\r
-            cfg_reg_addr = this_gpio->base_addr + (port_id * 4);\r
-            config = HW_get_8bit_reg( cfg_reg_addr );\r
-            config &= ~OUTPUT_BUFFER_ENABLE_MASK;\r
-            HW_set_8bit_reg( cfg_reg_addr, config );\r
-            break;\r
-            \r
-        default:\r
-            HAL_ASSERT(0);\r
-            break;\r
-    }\r
-}\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * GPIO_enable_irq\r
- * See "core_gpio.h" for details of how to use this function.\r
- */\r
-void GPIO_enable_irq\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    gpio_id_t           port_id\r
-)\r
-{\r
-    uint32_t cfg_value;\r
-    uint32_t cfg_reg_addr = this_gpio->base_addr;\r
-   \r
-    HAL_ASSERT( port_id < NB_OF_GPIO );\r
-    \r
-    if ( port_id < NB_OF_GPIO )\r
-    {\r
-        cfg_reg_addr += (port_id * 4);\r
-        cfg_value = HW_get_8bit_reg( cfg_reg_addr );\r
-        cfg_value |= GPIO_INT_ENABLE_MASK;\r
-        HW_set_8bit_reg( cfg_reg_addr, cfg_value );\r
-    }\r
-}\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * GPIO_disable_irq\r
- * See "core_gpio.h" for details of how to use this function.\r
- */\r
-void GPIO_disable_irq\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    gpio_id_t           port_id\r
-)\r
-{\r
-    uint32_t cfg_value;\r
-    uint32_t cfg_reg_addr = this_gpio->base_addr;\r
-   \r
-    HAL_ASSERT( port_id < NB_OF_GPIO );\r
-    \r
-    if ( port_id < NB_OF_GPIO )\r
-    {\r
-        cfg_reg_addr += (port_id * 4);\r
-        cfg_value = HW_get_8bit_reg( cfg_reg_addr );\r
-        cfg_value &= ~GPIO_INT_ENABLE_MASK;\r
-        HW_set_8bit_reg( cfg_reg_addr, cfg_value );\r
-    }\r
-}\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * GPIO_clear_irq\r
- * See "core_gpio.h" for details of how to use this function.\r
- */\r
-void GPIO_clear_irq\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    gpio_id_t           port_id\r
-)\r
-{\r
-    uint32_t irq_clr_value = ((uint32_t)1) << ((uint32_t)port_id);\r
-    \r
-    switch( this_gpio->apb_bus_width )\r
-    {\r
-        case GPIO_APB_32_BITS_BUS:\r
-            HAL_set_32bit_reg( this_gpio->base_addr, IRQ, irq_clr_value );\r
-            break;\r
-            \r
-        case GPIO_APB_16_BITS_BUS:\r
-            HAL_set_16bit_reg( this_gpio->base_addr, IRQ0, irq_clr_value );\r
-            HAL_set_16bit_reg( this_gpio->base_addr, IRQ1, irq_clr_value >> 16 );\r
-            break;\r
-            \r
-        case GPIO_APB_8_BITS_BUS:\r
-            HAL_set_8bit_reg( this_gpio->base_addr, IRQ0, irq_clr_value );\r
-            HAL_set_8bit_reg( this_gpio->base_addr, IRQ1, irq_clr_value >> 8 );\r
-            HAL_set_8bit_reg( this_gpio->base_addr, IRQ2, irq_clr_value >> 16 );\r
-            HAL_set_8bit_reg( this_gpio->base_addr, IRQ3, irq_clr_value >> 24 );\r
-            break;\r
-            \r
-        default:\r
-            HAL_ASSERT(0);\r
-            break;\r
-    }\r
-}\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreGPIO/core_gpio.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreGPIO/core_gpio.h
deleted file mode 100644 (file)
index 68799be..0000000
+++ /dev/null
@@ -1,552 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2008-2015 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- *  CoreGPIO bare metal driver public API.\r
- *\r
- * SVN $Revision: 7964 $\r
- * SVN $Date: 2015-10-09 18:26:53 +0530 (Fri, 09 Oct 2015) $\r
- */\r
-\r
-/*=========================================================================*//**\r
-  @mainpage CoreGPIO Bare Metal Driver.\r
-\r
-  @section intro_sec Introduction\r
-  The CoreGPIO hardware IP includes up to 32 general purpose input output GPIOs.\r
-  This driver provides a set of functions for controlling the GPIOs as part of a\r
-  bare metal system where no operating system is available. These drivers\r
-  can be adapted for use as part of an operating system but the implementation\r
-  of the adaptation layer between this driver and the operating system's driver\r
-  model is outside the scope of this driver.\r
-  \r
-  @section driver_configuration Driver Configuration\r
-  The CoreGPIO individual IOs can be configured either in the hardware flow or\r
-  as part of the software application through calls to the GPIO_config() function.\r
-  GPIOs configured as as part of the hardware is fixed and cannot be modified\r
-  using a call to the GPI_config() function.\r
-  \r
-  @section theory_op Theory of Operation\r
-  The CoreGPIO driver uses the Actel Hardware Abstraction Layer (HAL) to access\r
-  hardware registers. You must ensure that the Actel HAL is included as part of\r
-  your software project. The Actel HAL is available through the Actel Firmware\r
-  Catalog.\r
-  \r
-  The CoreGPIO driver functions are logically grouped into the following groups:\r
-    - Initiliazation\r
-    - Configuration\r
-    - Reading and writing GPIO state\r
-    - Interrupt control\r
-  \r
-  The CoreGPIO driver is initialized through a call to the GPIO_init() function.\r
-  The GPIO_init() function must be called before any other GPIO driver functions\r
-  can be called.\r
-  \r
-  Each GPIO port is individually configured through a call to the\r
-  GPIO_config() function. Configuration includes deciding if a GPIO port\r
-  will be used as input, output or both. GPIO ports configured as inputs can be\r
-  further configured to generate interrupts based on the input's state.\r
-  Interrupts can be level or edge sensitive.\r
-  Please note that a CoreGPIO hardware instance can be generated, as part of the\r
-  hardware flow, with a fixed configuration for some or all of its IOs. Attempting\r
-  to modify the configuration of such a hardware configured IO using the\r
-  GPIO_config() function has no effect.\r
-  \r
-  The state of the GPIO ports can be read and written using the following\r
-  functions:\r
-    - GPIO_get_inputs()\r
-    - GPIO_get_outputs()\r
-    - GPIO_set_outputs()\r
-    - GPIO_drive_inout()\r
-    \r
-  Interrupts generated by GPIO ports configured as inputs are controlled using\r
-  the following functions:\r
-    - GPIO_enable_irq()\r
-    - GPIO_disable_irq()\r
-    - GPIO_clear_irq()\r
-  \r
- *//*=========================================================================*/\r
-#ifndef CORE_GPIO_H_\r
-#define CORE_GPIO_H_\r
-\r
-#include <stdint.h>\r
-#include "cpu_types.h"\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The gpio_id_t enumeration is used to identify GPIOs as part of the\r
-  parameter to functions:\r
-    - GPIO_config(),\r
-    - GPIO_drive_inout(),\r
-    - GPIO_enable_int(),\r
-    - GPIO_disable_int(),\r
-    - GPIO_clear_int()\r
- */\r
-typedef enum __gpio_id_t\r
-{\r
-    GPIO_0 = 0,\r
-    GPIO_1 = 1,\r
-    GPIO_2 = 2,\r
-    GPIO_3 = 3,\r
-    GPIO_4 = 4,\r
-    GPIO_5 = 5,\r
-    GPIO_6 = 6,\r
-    GPIO_7 = 7,\r
-    GPIO_8 = 8,\r
-    GPIO_9 = 9,\r
-    GPIO_10 = 10,\r
-    GPIO_11 = 11,\r
-    GPIO_12 = 12,\r
-    GPIO_13 = 13,\r
-    GPIO_14 = 14,\r
-    GPIO_15 = 15,\r
-    GPIO_16 = 16,\r
-    GPIO_17 = 17,\r
-    GPIO_18 = 18,\r
-    GPIO_19 = 19,\r
-    GPIO_20 = 20,\r
-    GPIO_21 = 21,\r
-    GPIO_22 = 22,\r
-    GPIO_23 = 23,\r
-    GPIO_24 = 24,\r
-    GPIO_25 = 25,\r
-    GPIO_26 = 26,\r
-    GPIO_27 = 27,\r
-    GPIO_28 = 28,\r
-    GPIO_29 = 29,\r
-    GPIO_30 = 30,\r
-    GPIO_31 = 31\r
-} gpio_id_t;\r
-\r
-typedef enum __gpio_apb_width_t\r
-{\r
-    GPIO_APB_8_BITS_BUS = 0,\r
-    GPIO_APB_16_BITS_BUS = 1,\r
-    GPIO_APB_32_BITS_BUS = 2,\r
-    GPIO_APB_UNKNOWN_BUS_WIDTH = 3\r
-} gpio_apb_width_t;\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- */\r
-typedef struct __gpio_instance_t\r
-{\r
-    addr_t              base_addr;\r
-    gpio_apb_width_t    apb_bus_width;\r
-} gpio_instance_t;\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  GPIO ports definitions used to identify GPIOs as part of the parameter to\r
-  function GPIO_set_outputs().\r
-  These definitions can also be used to identity GPIO through logical\r
-  operations on the return value of function GPIO_get_inputs().\r
- */\r
-#define GPIO_0_MASK                0x00000001UL\r
-#define GPIO_1_MASK                0x00000002UL\r
-#define GPIO_2_MASK         0x00000004UL\r
-#define GPIO_3_MASK            0x00000008UL\r
-#define GPIO_4_MASK            0x00000010UL\r
-#define GPIO_5_MASK            0x00000020UL\r
-#define GPIO_6_MASK            0x00000040UL\r
-#define GPIO_7_MASK            0x00000080UL\r
-#define GPIO_8_MASK            0x00000100UL\r
-#define GPIO_9_MASK                0x00000200UL\r
-#define GPIO_10_MASK           0x00000400UL\r
-#define GPIO_11_MASK           0x00000800UL\r
-#define GPIO_12_MASK           0x00001000UL\r
-#define GPIO_13_MASK           0x00002000UL\r
-#define GPIO_14_MASK           0x00004000UL\r
-#define GPIO_15_MASK           0x00008000UL\r
-#define GPIO_16_MASK           0x00010000UL\r
-#define GPIO_17_MASK           0x00020000UL\r
-#define GPIO_18_MASK           0x00040000UL\r
-#define GPIO_19_MASK           0x00080000UL\r
-#define GPIO_20_MASK           0x00100000UL\r
-#define GPIO_21_MASK           0x00200000UL\r
-#define GPIO_22_MASK           0x00400000UL\r
-#define GPIO_23_MASK           0x00800000UL\r
-#define GPIO_24_MASK           0x01000000UL\r
-#define GPIO_25_MASK           0x02000000UL\r
-#define GPIO_26_MASK           0x04000000UL\r
-#define GPIO_27_MASK           0x08000000UL\r
-#define GPIO_28_MASK           0x10000000UL\r
-#define GPIO_29_MASK           0x20000000UL\r
-#define GPIO_30_MASK           0x40000000UL\r
-#define GPIO_31_MASK           0x80000000UL\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * GPIO modes\r
- */\r
-#define GPIO_INPUT_MODE              0x0000000002UL\r
-#define GPIO_OUTPUT_MODE             0x0000000005UL\r
-#define GPIO_INOUT_MODE              0x0000000003UL\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * Possible GPIO inputs interrupt configurations.\r
- */\r
-#define GPIO_IRQ_LEVEL_HIGH                    0x0000000000UL\r
-#define GPIO_IRQ_LEVEL_LOW                     0x0000000020UL\r
-#define GPIO_IRQ_EDGE_POSITIVE         0x0000000040UL\r
-#define GPIO_IRQ_EDGE_NEGATIVE         0x0000000060UL\r
-#define GPIO_IRQ_EDGE_BOTH                     0x0000000080UL\r
-\r
-/*-------------------------------------------------------------------------*//**\r
- * Possible states for GPIO configured as INOUT.\r
- */\r
-typedef enum gpio_inout_state\r
-{\r
-    GPIO_DRIVE_LOW = 0,\r
-    GPIO_DRIVE_HIGH,\r
-    GPIO_HIGH_Z\r
-} gpio_inout_state_t;\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The GPIO_init() function initialises a CoreGPIO hardware instance and the data\r
-  structure associated with the CoreGPIO hardware instance.\r
-  Please note that a CoreGPIO hardware instance can be generated with a fixed\r
-  configuration for some or all of its IOs as part of the hardware flow. Attempting\r
-  to modify the configuration of such a hardware configured IO using the\r
-  GPIO_config() function has no effect.\r
-\r
-  @param this_gpio\r
-    Pointer to the gpio_instance_t data structure instance holding all data\r
-    regarding the CoreGPIO hardware instance being initialized. A pointer to the\r
-    same data structure will be used in subsequent calls to the CoreGPIO driver\r
-    functions in order to identify the CoreGPIO instance that should perform the\r
-    operation implemented by the called driver function.\r
-\r
-  @param base_addr\r
-    The base_addr parameter is the base address in the processor's memory map for\r
-    the registers of the GPIO instance being initialized.\r
-    \r
-  @param bus_width\r
-    The bus_width parameter informs the driver of the APB bus width selected during\r
-    the hardware flow configuration of the CoreGPIO hardware instance. It indicates\r
-    to the driver whether the CoreGPIO hardware registers will be visible as 8, 16\r
-    or 32 bits registers. Allowed value are:\r
-        - GPIO_APB_8_BITS_BUS\r
-        - GPIO_APB_16_BITS_BUS\r
-        - GPIO_APB_32_BITS_BUS\r
-  \r
-  @return\r
-    none.\r
-    \r
-  Example:\r
-  @code\r
-    #define COREGPIO_BASE_ADDR  0xC2000000\r
-    \r
-    gpio_instance_t g_gpio;\r
-    \r
-    void system_init( void )\r
-    {\r
-        GPIO_init( &g_gpio,    COREGPIO_BASE_ADDR, GPIO_APB_32_BITS_BUS );\r
-    }\r
-  @endcode\r
-  */\r
-void GPIO_init\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    addr_t              base_addr,\r
-    gpio_apb_width_t    bus_width\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The GPIO_config() function is used to configure an individual GPIO port.\r
\r
-  @param this_gpio\r
-    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
-    all data regarding the CoreGPIO instance controlled through this function call.\r
-\r
-  @param port_id\r
-    The port_id parameter identifies the GPIO port to be configured.\r
-    An enumeration item of the form GPIO_n where n is the number of the GPIO\r
-    port is used to identify the GPIO port. For example GPIO_0 identifies the\r
-    first GPIO port and GPIO_31 the last one.\r
-    \r
-  @param config\r
-    The config parameter specifies the configuration to be applied to the GPIO\r
-    port identified by the first parameter. It is a logical OR of GPIO mode and\r
-    the interrupt mode. The interrupt mode is only relevant if the GPIO is\r
-    configured as input.\r
-       Possible modes are:\r
-           - GPIO_INPUT_MODE,\r
-           - GPIO_OUTPUT_MODE,\r
-           - GPIO_INOUT_MODE.\r
-       Possible interrupt modes are:\r
-           - GPIO_IRQ_LEVEL_HIGH,\r
-           - GPIO_IRQ_LEVEL_LOW,\r
-           - GPIO_IRQ_EDGE_POSITIVE,\r
-           - GPIO_IRQ_EDGE_NEGATIVE,\r
-           - GPIO_IRQ_EDGE_BOTH\r
\r
-  @return\r
-    none.\r
-    \r
-  For example the following call will configure GPIO 4 as an input generating\r
-  interrupts on a low to high transition of the input:\r
-  @code\r
-  GPIO_config( &g_gpio, GPIO_4, GPIO_INPUT_MODE | GPIO_IRQ_EDGE_POSITIVE );\r
-  @endcode\r
- */\r
-void GPIO_config\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    gpio_id_t           port_id,\r
-    uint32_t            config\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The GPIO_set_outputs() function is used to set the state of the GPIO ports\r
-  configured as outputs.\r
\r
-  @param this_gpio\r
-    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
-    all data regarding the CoreGPIO instance controlled through this function call.\r
-\r
-  @param value\r
-    The value parameter specifies the state of the GPIO ports configured as\r
-    outputs. It is a bit mask of the form (GPIO_n_MASK | GPIO_m_MASK) where n\r
-    and m are numbers identifying GPIOs.\r
-    For example (GPIO_0_MASK | GPIO_1_MASK | GPIO_2_MASK ) specifies that the\r
-    first, second and third GPIOs' must be set high and all other outputs set\r
-    low.\r
-\r
-  @return\r
-    none.\r
-    \r
-  Example 1:\r
-    Set GPIOs outputs 0 and 8 high and all other GPIO outputs low.\r
-    @code\r
-        GPIO_set_outputs( &g_gpio, GPIO_0_MASK | GPIO_8_MASK );\r
-    @endcode\r
-\r
-  Example 2:\r
-    Set GPIOs outputs 2 and 4 low without affecting other GPIO outputs.\r
-    @code\r
-        uint32_t gpio_outputs;\r
-        gpio_outputs = GPIO_get_outputs( &g_gpio );\r
-        gpio_outputs &= ~( GPIO_2_MASK | GPIO_4_MASK );\r
-        GPIO_set_outputs( &g_gpio, gpio_outputs );\r
-    @endcode\r
-\r
-  @see GPIO_get_outputs()\r
- */\r
-void GPIO_set_outputs\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    uint32_t            value\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The GPIO_set_output() function is used to set the state of a single GPIO\r
-  port configured as output.\r
\r
-  @param this_gpio\r
-    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
-    all data regarding the CoreGPIO instance controlled through this function call.\r
-\r
-  @param port_id\r
-    The port_id parameter specifies the GPIO port that will have its output set\r
-    by a call to this function.\r
-  \r
-  @param value\r
-    The value parameter specifies the desired state for the GPIO output. A value\r
-    of 0 will set the output low and a value of 1 will set the port high.\r
-  \r
-  @return\r
-    none.\r
- */\r
-void GPIO_set_output\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    gpio_id_t           port_id,\r
-    uint8_t             value\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The GPIO_get_inputs() function is used to read the state of all GPIOs\r
-  confgured as inputs.\r
\r
-  @param this_gpio\r
-    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
-    all data regarding the CoreGPIO instance controlled through this function call.\r
-\r
-  @return\r
-    This function returns a 32 bit unsigned integer where each bit represents\r
-    the state of an input. The least significant bit representing the state of\r
-    GPIO 0 and the most significant bit the state of GPIO 31.\r
- */\r
-uint32_t GPIO_get_inputs\r
-(\r
-    gpio_instance_t *   this_gpio\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The GPIO_get_outputs() function is used to read the current state of all\r
-  GPIO outputs.\r
\r
-  @param this_gpio\r
-    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
-    all data regarding the CoreGPIO instance controlled through this function call.\r
-\r
-  @return\r
-     This function returns a 32 bit unsigned integer where each bit represents\r
-     the state of an output. The least significant bit representing the state\r
-     of GPIO 0 and the most significant bit the state of GPIO 31.\r
- */\r
-uint32_t GPIO_get_outputs\r
-(\r
-    gpio_instance_t *   this_gpio\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The GPIO_drive_inout() function is used to set the output state of a\r
-  GPIO configured as INOUT. An INOUT GPIO can be in one of three states:\r
-    - high\r
-    - low\r
-    - high impedance\r
-  An INOUT output would typically be used where several devices can drive the\r
-  state of a signal. The high and low states are equivalent to the high and low\r
-  states of a GPIO configured as output. The high impedance state is used to\r
-  prevent the GPIO from driving the state of the output and therefore allow\r
-  reading the state of the GPIO as an input.\r
-  Please note that the GPIO port you wish to use as INOUT through this function\r
-  must be configurable through software. Therefore the GPIO ports used as INOUT\r
-  must not have a fixed configuration selected as part of the hardware flow.\r
\r
-  @param this_gpio\r
-    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
-    all data regarding the CoreGPIO instance controlled through this function call.\r
-\r
-  @param port_id\r
-    The port_id parameter identifies the GPIO for whcih this function will\r
-    change the output state.\r
-    An enumeration item of the form GPIO_n where n is the number of the GPIO\r
-    port is used to identify the GPIO port. For example GPIO_0 identifies the\r
-    first GPIO port and GPIO_31 the last one.\r
-    \r
-  @param inout_state\r
-    The inout_state parameter specifies the state of the I/O identified by the\r
-    first parameter. Possible states are:\r
-                           - GPIO_DRIVE_HIGH,\r
-                           - GPIO_DRIVE_LOW,\r
-                           - GPIO_HIGH_Z (high impedance)\r
-\r
-  @return\r
-    none.\r
-    \r
-  Example:\r
-    The call to GPIO_drive_inout() below will set the GPIO 7 output to\r
-    high impedance state.\r
-    @code\r
-    GPIO_drive_inout( &g_gpio, GPIO_7, GPIO_HIGH_Z );\r
-    @endcode\r
- */\r
-void GPIO_drive_inout\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    gpio_id_t           port_id,\r
-    gpio_inout_state_t  inout_state\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The GPIO_enable_irq() function is used to enable an interrupt to be\r
-  generated based on the state of the input identified as parameter.\r
\r
-  @param this_gpio\r
-    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
-    all data regarding the CoreGPIO instance controlled through this function call.\r
-\r
-  @param port_id\r
-    The port_id parameter identifies the GPIO input the call to\r
-    GPIO_enable_irq() will enable to generate interrupts.\r
-    An enumeration item of the form GPIO_n where n is the number of the GPIO\r
-    port is used to identify the GPIO port. For example GPIO_0 identifies the\r
-    first GPIO port and GPIO_31 the last one.\r
-    \r
-  @return\r
-    none.\r
-    \r
-  Example:\r
-    The call to GPIO_enable_irq() below will allow GPIO 8 to generate\r
-    interrupts.\r
-    @code\r
-    GPIO_enable_irq( &g_gpio, GPIO_8 );\r
-    @endcode\r
- */\r
-void GPIO_enable_irq\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    gpio_id_t           port_id\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The GPIO_disable_irq() function is used to disable interrupt from being\r
-  generated based on the state of the input specified as parameter.\r
\r
-  @param this_gpio\r
-    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
-    all data regarding the CoreGPIO instance controlled through this function call.\r
-\r
-  @param port_id\r
-    The port_id parameter identifies the GPIO input the call to\r
-    GPIO_disable_irq() will disable from generating interrupts.\r
-    An enumeration item of the form GPIO_n where n is the number of the GPIO\r
-    port is used to identify the GPIO port. For example GPIO_0 identifies the\r
-    first GPIO port and GPIO_31 the last one.\r
\r
-  @return\r
-    none.\r
-    \r
-  Example:\r
-    The call to GPIO_disable_irq() below will prevent GPIO 8 from generating\r
-    interrupts.\r
-    @code\r
-    GPIO_disable_irq( &g_gpio, GPIO_8 );\r
-    @endcode\r
- */\r
-void GPIO_disable_irq\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    gpio_id_t           port_id\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The GPIO_clear_irq() function is used to clear the interrupt generated by\r
-  the GPIO specified as parameter. The GPIO_clear_irq() function  must be\r
-  called as part of a GPIO interrupt service routine (ISR) in order to prevent\r
-  the same interrupt event retriggering a call to the GPIO ISR.\r
-  Please note that interrupts may also need to be cleared in the processor's\r
-  interrupt controller.\r
\r
-  @param this_gpio\r
-    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
-    all data regarding the CoreGPIO instance controlled through this function call.\r
-\r
-  @param port_id\r
-    The port_id parameter identifies the GPIO input for which to clear the\r
-    interrupt.\r
-    An enumeration item of the form GPIO_n where n is the number of the GPIO\r
-    port is used to identify the GPIO port. For example GPIO_0 identifies the\r
-    first GPIO port and GPIO_31 the last one.\r
-    \r
-  @return\r
-    none.\r
-    \r
-  Example:\r
-    The example below demonstrates the use of the GPIO_clear_irq() function as\r
-    part of the GPIO 9 interrupt service routine on a Cortex-M processor.  \r
-    @code\r
-    void GPIO9_IRQHandler( void )\r
-    {\r
-        do_interrupt_processing();\r
-        \r
-        GPIO_clear_irq( &g_gpio, GPIO_9 );\r
-        \r
-        NVIC_ClearPendingIRQ( GPIO9_IRQn );\r
-    }\r
-    @endcode\r
- */\r
-void GPIO_clear_irq\r
-(\r
-    gpio_instance_t *   this_gpio,\r
-    gpio_id_t           port_id\r
-);\r
-\r
-#endif /* CORE_GPIO_H_ */\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreGPIO/coregpio_regs.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreGPIO/coregpio_regs.h
deleted file mode 100644 (file)
index afbbfbc..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2009-2015 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * SVN $Revision: 7964 $\r
- * SVN $Date: 2015-10-09 18:26:53 +0530 (Fri, 09 Oct 2015) $\r
- */\r
-#ifndef __CORE_GPIO_REGISTERS_H\r
-#define __CORE_GPIO_REGISTERS_H                1\r
-\r
-/*------------------------------------------------------------------------------\r
- * \r
- */\r
-#define IRQ_REG_OFFSET          0x80\r
-\r
-#define IRQ0_REG_OFFSET         0x80\r
-#define IRQ1_REG_OFFSET         0x84\r
-#define IRQ2_REG_OFFSET         0x88\r
-#define IRQ3_REG_OFFSET         0x8C\r
-\r
-/*------------------------------------------------------------------------------\r
- * \r
- */\r
-#define GPIO_IN_REG_OFFSET      0x90\r
-\r
-#define GPIO_IN0_REG_OFFSET     0x90\r
-#define GPIO_IN1_REG_OFFSET     0x94\r
-#define GPIO_IN2_REG_OFFSET     0x98\r
-#define GPIO_IN3_REG_OFFSET     0x9C\r
-\r
-/*------------------------------------------------------------------------------\r
- * \r
- */\r
-#define GPIO_OUT_REG_OFFSET     0xA0\r
-\r
-#define GPIO_OUT0_REG_OFFSET    0xA0\r
-#define GPIO_OUT1_REG_OFFSET    0xA4\r
-#define GPIO_OUT2_REG_OFFSET    0xA8\r
-#define GPIO_OUT3_REG_OFFSET    0xAC\r
-\r
-#endif /* __CORE_GPIO_REGISTERS_H */\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_i2c.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_i2c.c
deleted file mode 100644 (file)
index daa1887..0000000
+++ /dev/null
@@ -1,1563 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2009-2015 Microsemi  SoC Products Group.  All rights reserved.\r
- * \r
- * CoreI2C software driver implementation.\r
- * \r
- * SVN $Revision: 7984 $\r
- * SVN $Date: 2015-10-12 12:07:40 +0530 (Mon, 12 Oct 2015) $\r
- */\r
-#include <stdint.h>\r
-#include <stdlib.h>\r
-#include <stddef.h>\r
-#include <unistd.h>\r
-#include <errno.h>\r
-#include <sys/stat.h>\r
-#include <sys/times.h>\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include "cpu_types.h"\r
-#include "core_smbus_regs.h"\r
-#include "core_i2c.h"\r
-#include "hal.h"\r
-#include "hal_assert.h"\r
-\r
-\r
-#include <string.h>\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C transaction direction.\r
- */\r
-#define WRITE_DIR    0u\r
-#define READ_DIR     1u\r
-\r
-/* -- TRANSACTIONS TYPES -- */\r
-#define NO_TRANSACTION                      0u\r
-#define MASTER_WRITE_TRANSACTION            1u\r
-#define MASTER_READ_TRANSACTION             2u\r
-#define MASTER_RANDOM_READ_TRANSACTION      3u\r
-#define WRITE_SLAVE_TRANSACTION             4u\r
-#define READ_SLAVE_TRANSACTION              5u\r
-\r
-/* -- SMBUS H/W STATES -- */\r
-/* -- MASTER STATES -- */\r
-#define ST_BUS_ERROR        0x00u           /* Bus error during MST or selected slave modes */\r
-#define ST_I2C_IDLE         0xF8u           /* No activity and no interrupt either... */\r
-#define ST_START            0x08u           /* start condition sent */\r
-#define ST_RESTART          0x10u           /* repeated start */\r
-#define ST_SLAW_ACK         0x18u           /* SLA+W sent, ack received */\r
-#define ST_SLAW_NACK        0x20u           /* SLA+W sent, nack received */\r
-#define ST_TX_DATA_ACK      0x28u           /* Data sent, ACK'ed */\r
-#define ST_TX_DATA_NACK     0x30u           /* Data sent, NACK'ed */\r
-#define ST_LOST_ARB         0x38u           /* Master lost arbitration */\r
-#define ST_SLAR_ACK         0x40u           /* SLA+R sent, ACK'ed */\r
-#define ST_SLAR_NACK        0x48u           /* SLA+R sent, NACK'ed */\r
-#define ST_RX_DATA_ACK      0x50u           /* Data received, ACK sent */\r
-#define ST_RX_DATA_NACK     0x58u           /* Data received, NACK sent */\r
-#define ST_RESET_ACTIVATED  0xD0u           /* Master reset is activated */\r
-#define ST_STOP_TRANSMIT    0xE0u           /* Stop has been transmitted */\r
-\r
-/* -- SLAVE STATES -- */\r
-#define ST_SLAVE_SLAW       0x60u           /* SLA+W received */\r
-#define ST_SLAVE_SLAR_ACK   0xA8u           /* SLA+R received, ACK returned */\r
-#define ST_SLV_LA           0x68u           /* Slave lost arbitration */\r
-#define ST_GCA              0x70u           /* GCA received */\r
-#define ST_GCA_LA           0x78u           /* GCA lost arbitration */\r
-#define ST_RDATA            0x80u           /* Data received */\r
-#define ST_SLA_NACK         0x88u           /* Slave addressed, NACK returned */\r
-#define ST_GCA_ACK          0x90u           /* Previously addresses with GCA, data ACKed */\r
-#define ST_GCA_NACK         0x98u           /* GCA addressed, NACK returned */\r
-#define ST_RSTOP            0xA0u           /* Stop received */\r
-#define ST_SLARW_LA         0xB0u           /* Arbitration lost */\r
-#define ST_RACK             0xB8u           /* Byte sent, ACK received */\r
-#define ST_SLAVE_RNACK      0xC0u           /* Byte sent, NACK received */\r
-#define ST_FINAL            0xC8u           /* Final byte sent, ACK received */\r
-#define ST_SLV_RST          0xD8u           /* Slave reset state */\r
-\r
-\r
-/* I2C Channel base offset */\r
-#define CHANNEL_BASE_SHIFT    5u\r
-#define CHANNEL_MASK        0x1E0u\r
-\r
-/*\r
- * Maximum address offset length in slave write-read transactions.\r
- * A maximum of two bytes will be interpreted as address offset within the slave\r
- * tx buffer.\r
- */\r
-#define MAX_OFFSET_LENGTH       2u\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C interrupts control functions implemented "i2c_interrupt.c".\r
- * the implementation of these functions depend on the underlying hardware\r
- * design and how the CoreI2C interrupt line is connected to the system's\r
- * interrupt controller.\r
- */\r
-void I2C_enable_irq( i2c_instance_t * this_i2c );\r
-void I2C_disable_irq( i2c_instance_t * this_i2c );\r
-static void enable_slave_if_required(i2c_instance_t * this_i2c);\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_init()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_init\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    addr_t base_address,\r
-    uint8_t ser_address,\r
-    i2c_clock_divider_t ser_clock_speed\r
-)\r
-{\r
-    psr_t saved_psr;\r
-    uint_fast16_t clock_speed = (uint_fast16_t)ser_clock_speed;\r
-    \r
-    /*\r
-     * We need to disable ints while doing this as there is no guarantee we\r
-     * have not been called already and the ISR is active.\r
-     */\r
-\r
-   saved_psr=HAL_disable_interrupts();\r
-    \r
-    /*\r
-     * Initialize all items of the this_i2c data structure to zero. This\r
-     * initializes all state variables to their init value. It relies on\r
-     * the fact that NO_TRANSACTION, I2C_SUCCESS and I2C_RELEASE_BUS all\r
-     * have an actual value of zero.\r
-     */\r
-    memset(this_i2c, 0, sizeof(i2c_instance_t));\r
-    \r
-    /*\r
-     * Set base address of I2C hardware used by this instance.\r
-     */\r
-    this_i2c->base_address = base_address;\r
-\r
-    /*\r
-     * Update Serial address of the device\r
-     */\r
-    this_i2c->ser_address = ((uint_fast8_t)ser_address << 1u);\r
-    \r
-    /*\r
-     * Configure hardware.\r
-     */\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, ENS1, 0x00); /* Reset I2C hardware. */\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, ENS1, 0x01); /* set enable bit */\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, CR2, ( (clock_speed >> 2) & 0x01) );\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, CR1, ( (clock_speed >> 1) & 0x01) );\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, CR0, ( clock_speed & 0x01) );\r
-\r
-    HAL_set_8bit_reg(this_i2c->base_address, ADDRESS, this_i2c->ser_address);\r
-    HAL_set_8bit_reg(this_i2c->base_address, ADDRESS1, this_i2c->ser_address);\r
-    \r
-    /*\r
-     * Finally safe to enable interrupts.\r
-     */\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-}\r
-/*------------------------------------------------------------------------------\r
- * I2C_channel_init()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_channel_init\r
-(\r
-    i2c_instance_t * this_i2c_channel,\r
-    i2c_instance_t * this_i2c,\r
-    i2c_channel_number_t channel_number,\r
-    i2c_clock_divider_t ser_clock_speed\r
-)\r
-{\r
-    psr_t saved_psr;\r
-    uint_fast16_t clock_speed = (uint_fast16_t)ser_clock_speed;\r
-    \r
-    HAL_ASSERT(channel_number < I2C_MAX_CHANNELS);\r
-    HAL_ASSERT(I2C_CHANNEL_0 != channel_number);\r
-\r
-    /* \r
-     * Cannot allow channel 0 in this function as we will trash the hardware\r
-     * base address and slave address.\r
-     */\r
-    if ((channel_number < I2C_MAX_CHANNELS) &&\r
-        (I2C_CHANNEL_0 != channel_number))\r
-    {\r
-        /*\r
-         * We need to disable ints while doing this as the hardware should already\r
-         * be active at this stage.\r
-         */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-        /*\r
-         * Initialize channel data.\r
-         */\r
-        memset(this_i2c_channel, 0, sizeof(i2c_instance_t));\r
-        \r
-        this_i2c_channel->base_address =\r
-               ((this_i2c->base_address) & ~((addr_t)CHANNEL_MASK)) \r
-            | (((addr_t)channel_number) << CHANNEL_BASE_SHIFT);\r
-\r
-        this_i2c_channel->ser_address = this_i2c->ser_address;\r
-\r
-        HAL_set_8bit_reg_field(this_i2c_channel->base_address, ENS1, 0x00); /* Reset I2C channel hardware. */\r
-        HAL_set_8bit_reg_field(this_i2c_channel->base_address, ENS1, 0x01); /* set enable bit */\r
-        HAL_set_8bit_reg_field(this_i2c_channel->base_address, CR2, ( (clock_speed >> 2) & 0x01) );\r
-        HAL_set_8bit_reg_field(this_i2c_channel->base_address, CR1, ( (clock_speed >> 1) & 0x01) );\r
-        HAL_set_8bit_reg_field(this_i2c_channel->base_address, CR0, ( clock_speed & 0x01) );\r
-        /*\r
-         * Finally safe to enable interrupts.\r
-         */\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-    }\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_write()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_write\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t serial_addr,\r
-    const uint8_t * write_buffer,\r
-    uint16_t write_size,\r
-    uint8_t options\r
-)\r
-{\r
-    psr_t saved_psr;\r
-    volatile uint8_t stat_ctrl;\r
-\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-\r
-    /* Update the transaction only when there is no transaction going on I2C */\r
-    if( this_i2c->transaction == NO_TRANSACTION)\r
-    {\r
-      this_i2c->transaction = MASTER_WRITE_TRANSACTION;\r
-    }\r
-\r
-    /* Update the Pending transaction information so that transaction can restarted */\r
-    this_i2c->pending_transaction = MASTER_WRITE_TRANSACTION ;\r
-\r
-    /* Update target address */\r
-    this_i2c->target_addr = (uint_fast8_t)serial_addr << 1u;\r
-    this_i2c->dir = WRITE_DIR;\r
-    this_i2c->master_tx_buffer = write_buffer;\r
-    this_i2c->master_tx_size = write_size;\r
-    this_i2c->master_tx_idx = 0u;\r
-\r
-    /* Set I2C status in progress */\r
-    this_i2c->master_status = I2C_IN_PROGRESS;\r
-    this_i2c->options = options;\r
-\r
-    if(I2C_IN_PROGRESS == this_i2c->slave_status)\r
-    {\r
-        this_i2c->is_transaction_pending = 1u;\r
-    }\r
-    else\r
-    {\r
-        HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
-    }\r
-\r
-    /*\r
-     * Clear interrupts if required (depends on repeated starts).\r
-     * Since the Bus is on hold, only then prior status needs to\r
-     * be cleared.\r
-     */\r
-    if ( I2C_HOLD_BUS == this_i2c->bus_status )\r
-    {\r
-        HAL_set_8bit_reg_field(this_i2c->base_address, SI, 0x00u);\r
-    }\r
-\r
-    stat_ctrl = HAL_get_8bit_reg( this_i2c->base_address, STATUS);\r
-    stat_ctrl = stat_ctrl;  /* Avoids lint warning. */\r
-\r
-    /* Enable the interrupt. ( Re-enable) */\r
-    I2C_enable_irq( this_i2c );\r
-\r
-\r
-       HAL_restore_interrupts(saved_psr);\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_read()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_read\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t serial_addr,\r
-    uint8_t * read_buffer,\r
-    uint16_t read_size,\r
-    uint8_t options\r
-)\r
-{\r
-    psr_t saved_psr;\r
-    volatile uint8_t stat_ctrl;\r
-\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-    \r
-    /* Update the transaction only when there is no transaction going on I2C */\r
-    if( this_i2c->transaction == NO_TRANSACTION)\r
-    {\r
-      this_i2c->transaction = MASTER_READ_TRANSACTION;\r
-    }\r
-\r
-    /* Update the Pending transaction information so that transaction can restarted */\r
-    this_i2c->pending_transaction = MASTER_READ_TRANSACTION ;\r
-\r
-    /* Update target address */\r
-    this_i2c->target_addr = (uint_fast8_t)serial_addr << 1u;\r
-\r
-    this_i2c->dir = READ_DIR;\r
-\r
-    this_i2c->master_rx_buffer = read_buffer;\r
-    this_i2c->master_rx_size = read_size;\r
-    this_i2c->master_rx_idx = 0u;\r
-\r
-    /* Set I2C status in progress */\r
-    this_i2c->master_status = I2C_IN_PROGRESS;\r
-\r
-    this_i2c->options = options;\r
-    \r
-    if(I2C_IN_PROGRESS == this_i2c->slave_status)\r
-    {\r
-        this_i2c->is_transaction_pending = 1u;\r
-    }\r
-    else\r
-    {\r
-        HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
-    }\r
-\r
-    /*\r
-     * Clear interrupts if required (depends on repeated starts).\r
-     * Since the Bus is on hold, only then prior status needs to\r
-     * be cleared.\r
-     */\r
-    if ( I2C_HOLD_BUS == this_i2c->bus_status )\r
-    {\r
-        HAL_set_8bit_reg_field(this_i2c->base_address, SI, 0x00u);\r
-    }\r
-\r
-    stat_ctrl = HAL_get_8bit_reg( this_i2c->base_address, STATUS);\r
-    stat_ctrl = stat_ctrl;  /* Avoids lint warning. */\r
-\r
-    /* Enable the interrupt. ( Re-enable) */\r
-    I2C_enable_irq( this_i2c );\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_write_read()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_write_read\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t serial_addr,\r
-    const uint8_t * addr_offset,\r
-    uint16_t offset_size,\r
-    uint8_t * read_buffer,\r
-    uint16_t read_size,\r
-    uint8_t options\r
-)\r
-{\r
-    HAL_ASSERT(offset_size > 0u);\r
-    HAL_ASSERT(addr_offset != (uint8_t *)0);\r
-    HAL_ASSERT(read_size > 0u);\r
-    HAL_ASSERT(read_buffer != (uint8_t *)0);\r
-    \r
-    this_i2c->master_status = I2C_FAILED;\r
-    \r
-    if((read_size > 0u) && (offset_size > 0u))\r
-    {\r
-        psr_t saved_psr;\r
-        volatile uint8_t stat_ctrl;\r
-\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-\r
-        /* Update the transaction only when there is no transaction going on I2C */\r
-        if( this_i2c->transaction == NO_TRANSACTION)\r
-        {\r
-            this_i2c->transaction = MASTER_RANDOM_READ_TRANSACTION;\r
-        }\r
-\r
-        /* Update the Pending transaction information so that transaction can restarted */\r
-        this_i2c->pending_transaction = MASTER_RANDOM_READ_TRANSACTION ;\r
-\r
-        /* Update target address */\r
-        this_i2c->target_addr = (uint_fast8_t)serial_addr << 1u;\r
-\r
-        this_i2c->dir = WRITE_DIR;\r
-\r
-        this_i2c->master_tx_buffer = addr_offset;\r
-        this_i2c->master_tx_size = offset_size;\r
-        this_i2c->master_tx_idx = 0u;\r
-\r
-        this_i2c->master_rx_buffer = read_buffer;\r
-        this_i2c->master_rx_size = read_size;\r
-        this_i2c->master_rx_idx = 0u;\r
-        \r
-        /* Set I2C status in progress */\r
-        this_i2c->master_status = I2C_IN_PROGRESS;\r
-        this_i2c->options = options;\r
-        \r
-        if(I2C_IN_PROGRESS == this_i2c->slave_status)\r
-        {\r
-            this_i2c->is_transaction_pending = 1u;\r
-        }\r
-        else\r
-        {\r
-            HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
-        }\r
-\r
-        /*\r
-         * Clear interrupts if required (depends on repeated starts).\r
-         * Since the Bus is on hold, only then prior status needs to\r
-         * be cleared.\r
-         */\r
-        if ( I2C_HOLD_BUS == this_i2c->bus_status )\r
-        {\r
-            HAL_set_8bit_reg_field(this_i2c->base_address, SI, 0x00u);\r
-        }\r
-\r
-        stat_ctrl = HAL_get_8bit_reg( this_i2c->base_address, STATUS);\r
-        stat_ctrl = stat_ctrl;  /* Avoids lint warning. */\r
-            \r
-        /* Enable the interrupt. ( Re-enable) */\r
-        I2C_enable_irq( this_i2c );\r
-\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-    }\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_get_status()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-i2c_status_t I2C_get_status\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    i2c_status_t i2c_status ;\r
-\r
-    i2c_status = this_i2c->master_status ;\r
-\r
-    return i2c_status;\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_wait_complete()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-i2c_status_t I2C_wait_complete\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint32_t timeout_ms\r
-)\r
-{\r
-    i2c_status_t i2c_status;\r
-    psr_t saved_psr;\r
-    /*\r
-     * Because we have no idea of what CPU we are supposed to be running on\r
-     * we need to guard this write to the timeout value to avoid ISR/user code\r
-     * interaction issues. Checking the status below should be fine as only a\r
-     * single byte should change in that.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-    this_i2c->master_timeout_ms = timeout_ms;\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-\r
-    /* Run the loop until state returns I2C_FAILED  or I2C_SUCESS*/\r
-    do {\r
-        i2c_status = this_i2c->master_status;\r
-    } while(I2C_IN_PROGRESS == i2c_status);\r
-    return i2c_status;\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_system_tick()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_system_tick\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint32_t ms_since_last_tick\r
-)\r
-{\r
-    if(this_i2c->master_timeout_ms != I2C_NO_TIMEOUT)\r
-    {\r
-       if(this_i2c->master_timeout_ms > ms_since_last_tick)\r
-        {\r
-            this_i2c->master_timeout_ms -= ms_since_last_tick;\r
-        }\r
-        else\r
-        {\r
-            psr_t saved_psr;\r
-            /*\r
-             * We need to disable interrupts here to ensure we can update the\r
-             * shared data without the I2C ISR interrupting us.\r
-             */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-\r
-            /*\r
-             * Mark current transaction as having timed out.\r
-             */\r
-            this_i2c->master_status = I2C_TIMED_OUT;\r
-            this_i2c->transaction = NO_TRANSACTION;\r
-            this_i2c->is_transaction_pending = 0;\r
-\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-            \r
-            /*\r
-             * Make sure we do not incorrectly signal a timeout for subsequent\r
-             * transactions.\r
-             */\r
-            this_i2c->master_timeout_ms = I2C_NO_TIMEOUT;\r
-        }\r
-    }\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_set_slave_tx_buffer()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_set_slave_tx_buffer\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    const uint8_t * tx_buffer,\r
-    uint16_t tx_size\r
-)\r
-{\r
-    psr_t saved_psr;\r
-\r
-    /*\r
-     * We need to disable interrupts here to ensure we can update the\r
-     * shared data without the I2C ISR interrupting us.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-    \r
-    this_i2c->slave_tx_buffer = tx_buffer;\r
-    this_i2c->slave_tx_size = tx_size;\r
-    this_i2c->slave_tx_idx = 0u;\r
-    \r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_set_slave_rx_buffer()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_set_slave_rx_buffer\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t * rx_buffer,\r
-    uint16_t rx_size\r
-)\r
-{\r
-    psr_t saved_psr;\r
-\r
-    /*\r
-     * We need to disable interrupts here to ensure we can update the\r
-     * shared data without the I2C ISR interrupting us.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-\r
-    this_i2c->slave_rx_buffer = rx_buffer;\r
-    this_i2c->slave_rx_size = rx_size;\r
-    this_i2c->slave_rx_idx = 0u;\r
-\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_set_slave_mem_offset_length()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_set_slave_mem_offset_length\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t offset_length\r
-)\r
-{\r
-    HAL_ASSERT(offset_length <= MAX_OFFSET_LENGTH);\r
-    \r
-    /*\r
-     * Single byte update, should be interrupt safe\r
-     */\r
-    if(offset_length > MAX_OFFSET_LENGTH)\r
-    {\r
-        this_i2c->slave_mem_offset_length = MAX_OFFSET_LENGTH;\r
-    }\r
-    else\r
-    {\r
-        this_i2c->slave_mem_offset_length = offset_length;\r
-    }\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_register_write_handler()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_register_write_handler\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    i2c_slave_wr_handler_t handler\r
-)\r
-{\r
-    psr_t saved_psr;\r
-\r
-    /*\r
-     * We need to disable interrupts here to ensure we can update the\r
-     * shared data without the I2C ISR interrupting us.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-\r
-    this_i2c->slave_write_handler = handler;\r
-\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_enable_slave()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_enable_slave\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    psr_t saved_psr;\r
-\r
-    /*\r
-     * We need to disable interrupts here to ensure we can update the\r
-     * hardware register and slave mode flag without the I2C ISR interrupting\r
-     * us.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-\r
-    /* Set the Assert Acknowledge bit. */\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x01u);\r
-\r
-    /* Enable slave mode */\r
-    this_i2c->is_slave_enabled = 1u;\r
-\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-\r
-    /* Enable I2C IRQ*/\r
-    I2C_enable_irq( this_i2c );\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_disable_slave()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_disable_slave\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    psr_t saved_psr;\r
-\r
-    /*\r
-     * We need to disable interrupts here to ensure we can update the\r
-     * hardware register without the I2C ISR interrupting us.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-    \r
-    /* Reset the assert acknowledge bit. */\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x00u);\r
-\r
-    /* Disable slave mode with IRQ blocked to make whole change atomic */\r
-    this_i2c->is_slave_enabled = 0u;\r
-\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * \r
- */\r
-static void enable_slave_if_required\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    /*\r
-     * This function is only called from within the ISR and so does not need\r
-     * guarding on the register access.\r
-     */\r
-    if( 0 != this_i2c->is_slave_enabled )\r
-    {\r
-        HAL_set_8bit_reg_field( this_i2c->base_address, AA, 0x01u );\r
-    }\r
-}\r
-/*------------------------------------------------------------------------------\r
- * I2C_set_slave_second_addr()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-void I2C_set_slave_second_addr\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t second_slave_addr\r
-)\r
-{\r
-    uint8_t second_slave_address;\r
-    \r
-    /*\r
-      This function does not support CoreI2C hardware configured with a fixed \r
-      second slave address.  The current implementation of the ADDR1[0] register\r
-      bit makes it difficult for the driver to support both programmable and\r
-      fixed second slave address, so we choose to support programmable only.\r
-      With the programmable configuration, ADDR1[0] and ADDR0[0] both control\r
-      enable/disable of GCA recognition, as an effective OR of the 2 bit fields.\r
-      Therefore we set ADDR1[0] to 0 here, so that only ADDR0[0] controls GCA.\r
-     */\r
-    second_slave_address = (uint8_t)((second_slave_addr << 1u) & (~SLAVE1_EN_MASK));\r
-\r
-    /*\r
-     * Single byte register write, should be interrupt safe\r
-     */\r
-    HAL_set_8bit_reg(this_i2c->base_address, ADDRESS1, second_slave_address);\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_disable_slave_second_addr()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-void I2C_disable_slave_second_addr\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    /*\r
-      We are disabling the second slave address by setting the value of the 2nd\r
-      slave address to the primary slave address. The reason for using this method\r
-      of disabling 2nd slave address is that ADDRESS1[0] has different meaning \r
-      depending on hardware configuration. Its use would likely interfere with\r
-      the intended GCA setting.\r
-     */\r
-    /*\r
-     * Single byte register write, should be interrupt safe\r
-     */\r
-    HAL_set_8bit_reg(this_i2c->base_address, ADDRESS1, this_i2c->ser_address);\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * i2C_set_gca()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-\r
-void I2C_set_gca\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    /* \r
-     * This read modify write access should be interrupt safe as the address\r
-     * register is not written to in the ISR.\r
-     */\r
-    /* accept GC addressing. */\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, GC, 0x01u);\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_clear_gca()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-void I2C_clear_gca\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    /* \r
-     * This read modify write access should be interrupt safe as the address\r
-     * register is not written to in the ISR.\r
-     */\r
-    /* Clear GC addressing. */\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, GC, 0x00u);\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_isr()\r
- * See "core_i2c.h" for details of how to use this function.\r
- */\r
-void I2C_isr\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    volatile uint8_t status;\r
-    uint8_t data;\r
-    uint8_t hold_bus;\r
-    uint8_t clear_irq = 1u;\r
-\r
-    status = HAL_get_8bit_reg( this_i2c->base_address, STATUS);\r
-    \r
-    switch( status )\r
-    {\r
-        /************** MASTER TRANSMITTER / RECEIVER *******************/\r
-      \r
-        case ST_START: /* start has been xmt'd */\r
-        case ST_RESTART: /* repeated start has been xmt'd */\r
-           //write_hex(STDOUT_FILENO, status);\r
-            HAL_set_8bit_reg_field( this_i2c->base_address, STA, 0x00u);\r
-            HAL_set_8bit_reg( this_i2c->base_address, DATA, this_i2c->target_addr); /* write call address */\r
-            HAL_set_8bit_reg_field( this_i2c->base_address, DIR, this_i2c->dir); /* set direction bit */\r
-            if(this_i2c->dir == WRITE_DIR)\r
-            {\r
-                 this_i2c->master_tx_idx = 0u;\r
-            }\r
-            else\r
-            {\r
-                 this_i2c->master_rx_idx = 0u;\r
-            }\r
-\r
-            /*\r
-             * Clear the pending transaction. This condition will be true if the slave \r
-             * has acquired the bus to carry out pending master transaction which \r
-             * it had received during its slave transmission or reception mode. \r
-             */\r
-            if(this_i2c->is_transaction_pending)\r
-            {\r
-                this_i2c->is_transaction_pending = 0u;\r
-            }\r
-\r
-            /*\r
-             * Make sure to update proper transaction after master START\r
-             * or RESTART\r
-             */\r
-            if(this_i2c->transaction != this_i2c->pending_transaction)\r
-            {\r
-                this_i2c->transaction = this_i2c->pending_transaction;\r
-            }\r
-            break;\r
-            \r
-        case ST_LOST_ARB:\r
-              /* Set start bit.  Let's keep trying!  Don't give up! */\r
-              HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
-              break;\r
-\r
-        case ST_STOP_TRANSMIT:\r
-             /* Stop has been transmitted. Do nothing */\r
-              break;\r
-\r
-        /******************* MASTER TRANSMITTER *************************/\r
-        case ST_SLAW_NACK:\r
-           //write_hex(STDOUT_FILENO, status);\r
-            /* SLA+W has been transmitted; not ACK has been received - let's stop. */\r
-            HAL_set_8bit_reg_field(this_i2c->base_address, STO, 0x01u);\r
-            this_i2c->master_status = I2C_FAILED;\r
-            this_i2c->transaction = NO_TRANSACTION;\r
-            enable_slave_if_required(this_i2c);\r
-            break;\r
-            \r
-        case ST_SLAW_ACK:\r
-        case ST_TX_DATA_ACK:\r
-           //write_hex(STDOUT_FILENO, status);\r
-            /* data byte has been xmt'd with ACK, time to send stop bit or repeated start. */\r
-            if (this_i2c->master_tx_idx < this_i2c->master_tx_size)\r
-            {    \r
-                HAL_set_8bit_reg(this_i2c->base_address, DATA, (uint_fast8_t)this_i2c->master_tx_buffer[this_i2c->master_tx_idx++]);\r
-            }\r
-            else if ( this_i2c->transaction == MASTER_RANDOM_READ_TRANSACTION )\r
-            {\r
-                /* We are finished sending the address offset part of a random read transaction.\r
-                 * It is is time to send a restart in order to change direction. */\r
-                 this_i2c->dir = READ_DIR;\r
-                 HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
-            }\r
-            else /* done sending. let's stop */\r
-            {\r
-                /*\r
-                 * Set the transaction back to NO_TRANSACTION to allow user to do further\r
-                 * transaction\r
-                 */\r
-                this_i2c->transaction = NO_TRANSACTION;\r
-                hold_bus = this_i2c->options & I2C_HOLD_BUS;\r
-\r
-                /* Store the information of current I2C bus status in the bus_status*/\r
-                this_i2c->bus_status  = hold_bus;\r
-                if ( hold_bus == 0u )\r
-                { \r
-                    HAL_set_8bit_reg_field(this_i2c->base_address, STO, 0x01u);  /*xmt stop condition */\r
-                    enable_slave_if_required(this_i2c);\r
-                }\r
-                else\r
-                {\r
-                    I2C_disable_irq( this_i2c );\r
-                    clear_irq = 0u;\r
-                }\r
-                this_i2c->master_status = I2C_SUCCESS;\r
-            }\r
-            break;\r
-\r
-          case ST_TX_DATA_NACK:\r
-           //write_hex(STDOUT_FILENO, status);\r
-            /* data byte SENT, ACK to be received\r
-             * In fact, this means we've received a NACK (This may not be \r
-             * obvious, but if we've rec'd an ACK then we would be in state \r
-             * 0x28!) hence, let's send a stop bit\r
-             */\r
-            HAL_set_8bit_reg_field(this_i2c->base_address, STO, 0x01u);/* xmt stop condition */\r
-            this_i2c->master_status = I2C_FAILED;\r
-\r
-            /*\r
-             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
-             * transaction\r
-             */\r
-            this_i2c->transaction = NO_TRANSACTION;\r
-            enable_slave_if_required(this_i2c);\r
-            break;\r
-              \r
-      /********************* MASTER (or slave?) RECEIVER *************************/\r
-      \r
-      /* STATUS codes 08H, 10H, 38H are all covered in MTX mode */\r
-        case ST_SLAR_ACK: /* SLA+R tx'ed. */\r
-//         //write_hex(STDOUT_FILENO, status);\r
-            /* Let's make sure we ACK the first data byte received (set AA bit in CTRL) unless\r
-             * the next byte is the last byte of the read transaction.\r
-             */\r
-            if(this_i2c->master_rx_size > 1u)\r
-            {\r
-                HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x01u);\r
-            }\r
-            else if(1u == this_i2c->master_rx_size)\r
-            {\r
-                HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x00u);\r
-            }\r
-            else /* this_i2c->master_rx_size == 0u */\r
-            {\r
-                HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x01u);\r
-                HAL_set_8bit_reg_field(this_i2c->base_address, STO, 0x01u);\r
-                this_i2c->master_status = I2C_SUCCESS;\r
-                this_i2c->transaction = NO_TRANSACTION;\r
-            }\r
-            break;\r
-            \r
-        case ST_SLAR_NACK: /* SLA+R tx'ed; let's release the bus (send a stop condition) */\r
-//         //write_hex(STDOUT_FILENO, status);\r
-            HAL_set_8bit_reg_field(this_i2c->base_address, STO, 0x01u);\r
-            this_i2c->master_status = I2C_FAILED;\r
-\r
-            /*\r
-             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
-             * transaction\r
-             */\r
-            this_i2c->transaction = NO_TRANSACTION;\r
-            enable_slave_if_required(this_i2c);\r
-            break;\r
-          \r
-        case ST_RX_DATA_ACK: /* Data byte received, ACK returned */\r
-//         //write_hex(STDOUT_FILENO, status);\r
-            /* First, get the data */\r
-            this_i2c->master_rx_buffer[this_i2c->master_rx_idx++] = HAL_get_8bit_reg(this_i2c->base_address, DATA);\r
-            if( this_i2c->master_rx_idx >= (this_i2c->master_rx_size - 1u))\r
-            {\r
-                /* If we're at the second last byte, let's set AA to 0 so\r
-                 * we return a NACK at the last byte. */\r
-                HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x00u);\r
-            }\r
-            break;\r
-            \r
-        case ST_RX_DATA_NACK: /* Data byte received, NACK returned */\r
-//         //write_hex(STDOUT_FILENO, status);\r
-            /* Get the data, then send a stop condition */\r
-            this_i2c->master_rx_buffer[this_i2c->master_rx_idx] = HAL_get_8bit_reg(this_i2c->base_address, DATA);\r
-          \r
-            hold_bus = this_i2c->options & I2C_HOLD_BUS; \r
-\r
-            /* Store the information of current I2C bus status in the bus_status*/\r
-            this_i2c->bus_status  = hold_bus;\r
-            if ( hold_bus == 0u )\r
-            { \r
-                HAL_set_8bit_reg_field(this_i2c->base_address, STO, 0x01u);  /*xmt stop condition */\r
-\r
-                /* Bus is released, now we can start listening to bus, if it is slave */\r
-                   enable_slave_if_required(this_i2c);\r
-            }\r
-            else\r
-            {\r
-                I2C_disable_irq( this_i2c );\r
-                clear_irq = 0u;\r
-            }\r
-            /*\r
-             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
-             * transaction\r
-             */\r
-            this_i2c->transaction = NO_TRANSACTION;\r
-            this_i2c->master_status = I2C_SUCCESS;\r
-            break;\r
-        \r
-        /******************** SLAVE RECEIVER **************************/\r
-        case ST_GCA_NACK: /* NACK after, GCA addressing */\r
-        case ST_SLA_NACK: /* Re-enable AA (assert ack) bit for future transmissions */\r
-           //write_hex(STDOUT_FILENO, status);\r
-            HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x01u);\r
-\r
-            this_i2c->transaction = NO_TRANSACTION;\r
-            this_i2c->slave_status = I2C_SUCCESS;\r
-            \r
-            /* Check if transaction was pending. If yes, set the START bit */\r
-            if(this_i2c->is_transaction_pending)\r
-            {\r
-                HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
-            }\r
-            break;\r
-            \r
-        case ST_GCA_LA: /* Arbitr. lost (GCA rec'd) */\r
-        case ST_SLV_LA: /* Arbitr. lost (SLA rec'd) */\r
-           //write_hex(STDOUT_FILENO, status);\r
-            /*\r
-             *  We lost arbitration and either the GCE or our address was the\r
-             *  one received so pend the master operation we were starting.\r
-             */\r
-            this_i2c->is_transaction_pending = 1u;\r
-            /* Fall through to normal ST processing as we are now in slave mode */\r
-\r
-        case ST_GCA: /* General call address received, ACK returned */\r
-        case ST_SLAVE_SLAW: /* SLA+W received, ACK returned */\r
-           //write_hex(STDOUT_FILENO, status);\r
-            this_i2c->transaction = WRITE_SLAVE_TRANSACTION;\r
-            this_i2c->slave_rx_idx = 0u;\r
-            this_i2c->random_read_addr = 0u;\r
-            /*\r
-             * If Start Bit is set clear it, but store that information since it is because of\r
-             * pending transaction\r
-             */\r
-            if(HAL_get_8bit_reg_field(this_i2c->base_address, STA))\r
-            {\r
-                HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x00u);\r
-                this_i2c->is_transaction_pending = 1u;\r
-            }\r
-            this_i2c->slave_status = I2C_IN_PROGRESS;\r
-#ifdef INCLUDE_SLA_IN_RX_PAYLOAD\r
-            /* Fall through to put address as first byte in payload buffer */\r
-#else\r
-            /* Only break from this case if the slave address must NOT be included at the\r
-             * beginning of the received write data. */\r
-            break;\r
-#endif            \r
-        case ST_GCA_ACK: /* DATA received; ACK sent after GCA */\r
-        case ST_RDATA: /* DATA received; must clear DATA register */\r
-           //write_hex(STDOUT_FILENO, status);\r
-            if((this_i2c->slave_rx_buffer != (uint8_t *)0)\r
-               && (this_i2c->slave_rx_idx < this_i2c->slave_rx_size))\r
-            {\r
-                data = HAL_get_8bit_reg(this_i2c->base_address, DATA);\r
-                this_i2c->slave_rx_buffer[this_i2c->slave_rx_idx++] = data;\r
-                \r
-#ifdef INCLUDE_SLA_IN_RX_PAYLOAD\r
-                if((ST_RDATA == status) || (ST_GCA_ACK == status))\r
-                {\r
-                    /* Ignore the slave address byte in the random read address\r
-                       computation in the case where INCLUDE_SLA_IN_RX_PAYLOAD\r
-                       is defined. */\r
-#endif\r
-                    this_i2c->random_read_addr = (this_i2c->random_read_addr << 8) + data;\r
-#ifdef INCLUDE_SLA_IN_RX_PAYLOAD\r
-                }\r
-#endif\r
-            }\r
-            \r
-            if(this_i2c->slave_rx_idx >= this_i2c->slave_rx_size)\r
-            {\r
-                /* Rx buffer is full. NACK next received byte. */\r
-                HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x00u); \r
-            }\r
-            break;\r
-            \r
-        case ST_RSTOP:\r
-           //write_hex(STDOUT_FILENO, status);\r
-            /* STOP or repeated START occurred. */\r
-            /* We cannot be sure if the transaction has actually completed as\r
-             * this hardware state reports that either a STOP or repeated START\r
-             * condition has occurred. We assume that this is a repeated START\r
-             * if the transaction was a write from the master to this point.*/\r
-            if ( this_i2c->transaction == WRITE_SLAVE_TRANSACTION )\r
-            {\r
-                if ( this_i2c->slave_rx_idx == this_i2c->slave_mem_offset_length )\r
-                {\r
-                    this_i2c->slave_tx_idx = this_i2c->random_read_addr;\r
-                }\r
-                /* Call the slave's write transaction handler if it exists. */\r
-                if ( this_i2c->slave_write_handler != 0u )\r
-                {\r
-                    i2c_slave_handler_ret_t h_ret;\r
-                    h_ret = this_i2c->slave_write_handler( this_i2c, this_i2c->slave_rx_buffer, (uint16_t)this_i2c->slave_rx_idx );\r
-                    if ( I2C_REENABLE_SLAVE_RX == h_ret )\r
-                    {\r
-                        /* There is a small risk that the write handler could\r
-                         * call I2C_disable_slave() but return\r
-                         * I2C_REENABLE_SLAVE_RX in error so we only enable\r
-                         * ACKs if still in slave mode. */\r
-                         enable_slave_if_required(this_i2c);\r
-                    }\r
-                    else\r
-                    {\r
-                        HAL_set_8bit_reg_field( this_i2c->base_address, AA, 0x0u );\r
-                        /* Clear slave mode flag as well otherwise in mixed\r
-                         * master/slave applications, the AA bit will get set by\r
-                         * subsequent master operations. */\r
-                        this_i2c->is_slave_enabled = 0u;\r
-                    }\r
-                }\r
-                else\r
-                {\r
-                    /* Re-enable address acknowledge in case we were ready to nack the next received byte. */\r
-                    HAL_set_8bit_reg_field( this_i2c->base_address, AA, 0x01u );\r
-                }\r
-            }\r
-            else /* A stop or repeated start outside a write/read operation */\r
-            {\r
-                /*\r
-                 * Reset slave_tx_idx so that a subsequent read will result in the slave's\r
-                 * transmit buffer being sent from the first byte.\r
-                 */\r
-                this_i2c->slave_tx_idx = 0u;\r
-                /*\r
-                 * See if we need to re-enable acknowledgement as some error conditions, such\r
-                 * as a master prematurely ending a transfer, can see us get here with AA set\r
-                 * to 0 which will disable slave operation if we are not careful.\r
-                 */\r
-                enable_slave_if_required(this_i2c);\r
-            }\r
-\r
-            /* Mark any previous master write transaction as complete. */\r
-            this_i2c->slave_status = I2C_SUCCESS;\r
-            \r
-            /* Check if transaction was pending. If yes, set the START bit */\r
-            if(this_i2c->is_transaction_pending)\r
-            {\r
-                HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
-            }\r
-\r
-            /*\r
-             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
-             * transaction\r
-             */\r
-            this_i2c->transaction = NO_TRANSACTION;\r
-\r
-            break;\r
-            \r
-        case ST_SLV_RST: /* SMBUS ONLY: timeout state. must clear interrupt */\r
-           //write_hex(STDOUT_FILENO, status);\r
-            /*\r
-             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
-             * transaction.\r
-             */\r
-            this_i2c->transaction = NO_TRANSACTION;\r
-            /*\r
-             * Reset slave_tx_idx so that a subsequent read will result in the slave's\r
-             * transmit buffer being sent from the first byte.\r
-             */\r
-            this_i2c->slave_tx_idx = 0u;\r
-            /*\r
-             * Clear status to I2C_FAILED only if there was an operation in progress.\r
-             */\r
-            if(I2C_IN_PROGRESS == this_i2c->slave_status)\r
-            {\r
-                this_i2c->slave_status = I2C_FAILED;\r
-            }\r
-\r
-            enable_slave_if_required(this_i2c); /* Make sure AA is set correctly */\r
-\r
-            break;\r
-            \r
-        /****************** SLAVE TRANSMITTER **************************/\r
-        case ST_SLAVE_SLAR_ACK: /* SLA+R received, ACK returned */\r
-        case ST_SLARW_LA:       /* Arbitration lost, and: */\r
-        case ST_RACK:           /* Data tx'ed, ACK received */\r
-           //write_hex(STDOUT_FILENO, status);\r
-            if ( status == ST_SLAVE_SLAR_ACK )\r
-            {\r
-                this_i2c->transaction = READ_SLAVE_TRANSACTION;\r
-                this_i2c->random_read_addr = 0u;\r
-                this_i2c->slave_status = I2C_IN_PROGRESS;\r
-                /* If Start Bit is set clear it, but store that information since it is because of\r
-                 * pending transaction\r
-                 */\r
-                if(HAL_get_8bit_reg_field(this_i2c->base_address, STA))\r
-                {\r
-                    HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x00u);\r
-                    this_i2c->is_transaction_pending = 1u;\r
-                 }\r
-            }\r
-            if (this_i2c->slave_tx_idx >= this_i2c->slave_tx_size)\r
-            {\r
-                /* Ensure 0xFF is returned to the master when the slave specifies\r
-                 * an empty transmit buffer. */\r
-                HAL_set_8bit_reg(this_i2c->base_address, DATA, 0xFFu);\r
-            }\r
-            else\r
-            {\r
-                /* Load the data the data byte to be sent to the master. */\r
-                HAL_set_8bit_reg(this_i2c->base_address, DATA, (uint_fast8_t)this_i2c->slave_tx_buffer[this_i2c->slave_tx_idx++]);\r
-            }\r
-            /* Determine if this is the last data byte to send to the master. */\r
-            if (this_i2c->slave_tx_idx >= this_i2c->slave_tx_size) /* last byte? */\r
-            {\r
-                 HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x00u); \r
-                /* Next read transaction will result in slave's transmit buffer\r
-                 * being sent from the first byte. */\r
-                this_i2c->slave_tx_idx = 0u;\r
-            }\r
-            break;\r
-        \r
-        case ST_SLAVE_RNACK:    /* Data byte has been transmitted; not-ACK has been received. */\r
-        case ST_FINAL: /* Last Data byte tx'ed, ACK received */\r
-           //write_hex(STDOUT_FILENO, status);\r
-            /* We assume that the transaction will be stopped by the master.\r
-             * Reset slave_tx_idx so that a subsequent read will result in the slave's\r
-             * transmit buffer being sent from the first byte. */\r
-            this_i2c->slave_tx_idx = 0u;\r
-            HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x01u); \r
-\r
-            /*  Mark previous state as complete */\r
-            this_i2c->slave_status = I2C_SUCCESS;\r
-            /* Check if transaction was pending. If yes, set the START bit */\r
-            if(this_i2c->is_transaction_pending)\r
-            {\r
-                HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
-            }\r
-            /*\r
-             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
-             * transaction\r
-             */\r
-            this_i2c->transaction = NO_TRANSACTION;\r
-\r
-            break;\r
-\r
-        /* Master Reset has been activated Wait 35 ms for interrupt to be set,\r
-         * clear interrupt and proceed to 0xF8 state. */\r
-        case ST_RESET_ACTIVATED:\r
-        case ST_BUS_ERROR: /* Bus error during MST or selected slave modes */\r
-        default:\r
-           //write_hex(STDOUT_FILENO, status);\r
-            /* Some undefined state has encountered. Clear Start bit to make\r
-             * sure, next good transaction happen */\r
-            HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x00u);\r
-            /*\r
-             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
-             * transaction.\r
-             */\r
-            this_i2c->transaction = NO_TRANSACTION;\r
-            /*\r
-             * Reset slave_tx_idx so that a subsequent read will result in the slave's\r
-             * transmit buffer being sent from the first byte.\r
-             */\r
-            this_i2c->slave_tx_idx = 0u;\r
-            /*\r
-             * Clear statuses to I2C_FAILED only if there was an operation in progress.\r
-             */\r
-            if(I2C_IN_PROGRESS == this_i2c->master_status)\r
-            {\r
-                this_i2c->master_status = I2C_FAILED;\r
-            }\r
-\r
-            if(I2C_IN_PROGRESS == this_i2c->slave_status)\r
-            {\r
-                this_i2c->slave_status = I2C_FAILED;\r
-            }\r
-\r
-            break;\r
-    }\r
-    \r
-    if ( clear_irq )\r
-    {\r
-        /* clear interrupt. */\r
-        HAL_set_8bit_reg_field(this_i2c->base_address, SI, 0x00u);\r
-    }\r
-    \r
-    /* Read the status register to ensure the last I2C registers write took place\r
-     * in a system built around a bus making use of posted writes. */\r
-//    status = HAL_get_8bit_reg( this_i2c->base_address, STATUS);\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_smbus_init()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
\r
-/*\r
- * SMBSUS_NO    = 1\r
- * SMBALERT_NO  = 1\r
- * SMBus enable = 1\r
- */\r
-#define INIT_AND_ENABLE_SMBUS   0x54u\r
-void I2C_smbus_init\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    /*\r
-     * Single byte register write, should be interrupt safe\r
-     */\r
-    /* Enable SMBUS */\r
-    HAL_set_8bit_reg(this_i2c->base_address, SMBUS, INIT_AND_ENABLE_SMBUS);\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_enable_smbus_irq()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-void I2C_enable_smbus_irq\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t  irq_type\r
-)\r
-{\r
-    psr_t saved_psr;\r
-\r
-    /*\r
-     * We need to disable interrupts here to ensure we can update the\r
-     * hardware register without the SMBUS IRQs interrupting us.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-\r
-    if ( irq_type & I2C_SMBALERT_IRQ)\r
-    {\r
-        HAL_set_8bit_reg_field(this_i2c->base_address, SMBALERT_IE, 0x01u);\r
-    }\r
-    if ( irq_type & I2C_SMBSUS_IRQ)\r
-    {\r
-        HAL_set_8bit_reg_field(this_i2c->base_address, SMBSUS_IE, 0x01u);\r
-    }\r
-    \r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_disable_smbus_irq()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-void I2C_disable_smbus_irq\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t  irq_type\r
-)\r
-{\r
-    psr_t saved_psr;\r
-\r
-    /*\r
-     * We need to disable interrupts here to ensure we can update the\r
-     * hardware register without the SMBUS IRQs interrupting us.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-\r
-    if ( irq_type & I2C_SMBALERT_IRQ)\r
-    {\r
-        HAL_set_8bit_reg_field(this_i2c->base_address, SMBALERT_IE, 0x00u);\r
-    }\r
-    if (irq_type & I2C_SMBSUS_IRQ )\r
-    {\r
-        HAL_set_8bit_reg_field(this_i2c->base_address, SMBSUS_IE, 0x00u);\r
-    }\r
-    \r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_suspend_smbus_slave()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-void I2C_suspend_smbus_slave\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    psr_t saved_psr;\r
-\r
-    /*\r
-     * We need to disable interrupts here to ensure we can update the\r
-     * hardware register without the SMBUS IRQs interrupting us.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, SMBSUS_NO_CONTROL, 0x00u);\r
-\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_resume_smbus_slave()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-void I2C_resume_smbus_slave\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    psr_t saved_psr;\r
-\r
-    /*\r
-     * We need to disable interrupts here to ensure we can update the\r
-     * hardware register without the SMBUS IRQs interrupting us.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, SMBSUS_NO_CONTROL, 0x01u);\r
-\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_reset_smbus()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-void I2C_reset_smbus\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    psr_t saved_psr;\r
-\r
-    /*\r
-     * We need to disable interrupts here to ensure we can update the\r
-     * hardware register without the SMBUS IRQs interrupting us.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, SMBUS_MST_RESET, 0x01u);\r
-    \r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_set_smbus_alert()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-void I2C_set_smbus_alert\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    psr_t saved_psr;\r
-\r
-    /*\r
-     * We need to disable interrupts here to ensure we can update the\r
-     * hardware register without the SMBUS IRQs interrupting us.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, SMBALERT_NO_CONTROL, 0x00u);\r
-\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_clear_smbus_alert()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-void I2C_clear_smbus_alert\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    psr_t saved_psr;\r
-\r
-    /*\r
-     * We need to disable interrupts here to ensure we can update the\r
-     * hardware register without the SMBUS IRQs interrupting us.\r
-     */\r
-\r
-       saved_psr=HAL_disable_interrupts();\r
-\r
-    HAL_set_8bit_reg_field(this_i2c->base_address, SMBALERT_NO_CONTROL, 0x01u);\r
-\r
-\r
-       HAL_restore_interrupts( saved_psr );\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_get_irq_status()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-uint8_t I2C_get_irq_status\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    uint8_t status ;\r
-    uint8_t irq_type = I2C_NO_IRQ ;\r
-\r
-    status = HAL_get_8bit_reg(this_i2c->base_address, SMBUS);\r
-\r
-    if( status & (uint8_t)SMBALERT_NI_STATUS_MASK )\r
-    {\r
-        irq_type |= I2C_SMBALERT_IRQ ;\r
-    }\r
-\r
-    if( status & (uint8_t)SMBSUS_NI_STATUS_MASK )\r
-    {\r
-        irq_type |= I2C_SMBSUS_IRQ ;\r
-    }\r
-\r
-    status = HAL_get_8bit_reg(this_i2c->base_address, CONTROL);\r
-\r
-    if( status & (uint8_t)SI_MASK )\r
-    {\r
-        irq_type |= I2C_INTR_IRQ ;\r
-    }\r
-    return(irq_type);\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_set_slave_addr2()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-void I2C_set_user_data\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    void * p_user_data\r
-)\r
-{\r
-    this_i2c->p_user_data = p_user_data ;\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * I2C_get_user_data()\r
- * See "i2c.h" for details of how to use this function.\r
- */\r
-void * I2C_get_user_data\r
-(\r
-    i2c_instance_t * this_i2c\r
-)\r
-{\r
-    return( this_i2c->p_user_data);\r
-}\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_i2c.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_i2c.h
deleted file mode 100644 (file)
index 2b1d5ac..0000000
+++ /dev/null
@@ -1,2280 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2009-2015 Microsemi SoC Products Group.  All rights reserved.\r
- * \r
- * CoreI2C software driver Application Programming Interface.\r
- * This file contains defines and function declarations allowing to interface\r
- * with the CoreI2C software driver.\r
- * \r
- * SVN $Revision: 7984 $\r
- * SVN $Date: 2015-10-12 12:07:40 +0530 (Mon, 12 Oct 2015) $\r
- */\r
-/*=========================================================================*//**\r
-  @mainpage CoreI2C Bare Metal Driver.\r
-   The CoreI2C bare metal software driver supports I2C master and slave\r
-   operations.\r
-\r
-  @section intro_sec Introduction\r
-  The CoreI2C driver provides a set of functions for controlling the Microsemi\r
-  CoreI2C hardware IP. The driver supports up to 16 separate I2C channels per\r
-  CoreI2C instance, with common slave address settings shared between channels\r
-  on a device.\r
-  \r
-  Optional features of the CoreI2C allow it operate with I2C based protocols\r
-  such as System Management Bus (SMBus), Power Management Bus (PMBus) and\r
-  Intelligent Platform Management Interface (IPMI). This driver provides support\r
-  for these features when enabled in the CoreI2C IP.\r
-  \r
-  The major features provided by CoreI2C driver are:\r
-    - Support for configuring the I2C channels of each CoreI2C peripheral.\r
-    - I2C master operations.\r
-    - I2C slave operations.\r
-    - SMBus related operations.\r
-\r
-  This driver can be used as part of a bare metal system where no operating \r
-  system  is available. The driver can be adapted for use as part of an \r
-  operating system, but the implementation of the adaptation layer between the \r
-  driver and  the operating system's driver model is outside the scope of this \r
-  driver.\r
-  \r
-  @section hw_dependencies Hardware Flow Dependencies\r
-  Your application software should configure the CoreI2C driver through\r
-  calls to the I2C_init() function for each CoreI2C instance in the\r
-  hardware design.  The configuration parameters include the CoreI2C hardware\r
-  instance base address and other runtime parameters, such as the I2C serial\r
-  clock frequency and I2C device address.\r
-  \r
-  Once channel 0 of a CoreI2C peripheral has been initialized via I2C_init(),\r
-  any additional channels present should be configured by calling\r
-  I2C_channel_init() for each of the remaining channels.\r
-  \r
-  No CoreI2C hardware configuration parameters are used by the driver, apart\r
-  from the CoreI2C hardware instance base address. Hence, no additional\r
-  configuration files are required to use the driver. \r
-  \r
-  Interrupt Control\r
-  The CoreI2C driver has to enable and disable the generation of interrupts by\r
-  CoreI2C at various times when it is operating. This enabling and disabling of\r
-  interrupts must be done through the system\92s interrupt controller. For that\r
-  reason, the method of controlling the CoreI2C interrupt is system specific\r
-  and it is necessary to customize the I2C_enable_irq() and I2C_disable_irq()\r
-  functions. These functions are found in the file i2c_interrupt.c. Their\r
-  default implementation fires an assertion to attract attention to the fact\r
-  that these functions must be modified.\r
-  \r
-  The implementation of the I2C_enable_irq() function should permit interrupts\r
-  generated by a CoreI2C instance to interrupt the processor. The implementation\r
-  of the I2C_disable_irq() function should prevent interrupts generated by a\r
-  CoreI2C instance from interrupting the processor. Please refer to the provided\r
-  example projects for a working implementation of these functions.\r
-  \r
-  The function I2C_register_write_handler() is used to register a write handler\r
-  function with the CoreI2C driver that it calls on completion of an I2C write\r
-  transaction by the CoreI2C slave. It is your responsibility to create and\r
-  register the implementation of this handler function that processes or\r
-  trigger the processing of the received data.\r
-  \r
-  The SMBSUS and SMBALERT interrupts are related to the SMBus interface and are\r
-  enabled and disabled through I2C_enable_smbus_irq() and \r
-  I2C_disable_smbus_irq() respectively. It is your responsibility to create\r
-  interrupt handler functions in your application to get the desired response\r
-  for the SMBus interrupts.\r
-\r
-  Note: You must include the path to any application header files that are\r
-        included in the i2c_interrupt.c file, as an include path in your\r
-        project\92s compiler settings. The details of how to do this will depend\r
-        on your development software.\r
-\r
-  SMBus Logic options\r
-  SMBus related APIs will not have any effect if in CoreI2C hardware\r
-  configuration "Generate SMBus Logic" is not enabled. The APIs which will not\r
-  give desired results in case SMBus Logic is disabled are:\r
-  \r
-      I2C_smbus_init()\r
-      I2C_reset_smbus()\r
-      I2C_enable_smbus_irq()\r
-      I2C_disable_smbus_irq()\r
-      I2C_suspend_smbus_slave()\r
-      I2C_resume_smbus_slave()\r
-      I2C_set_smsbus_alert()\r
-      I2C_clear_smsbus_alert()\r
-      I2C_get_irq_status() \r
-\r
-  Fixed Baud Rate Values\r
-  The serial clock frequency parameter passed to the I2C_init() and \r
-  I2C_channel_init() functions may not have any effect if fixed values were\r
-  selected for Baud rate in the hardware configuration of CoreI2C. When fixed\r
-  values are selected for these baud rates, the driver cannot overwrite\r
-  the fixed values.\r
-\r
-  Fixed Slave Address Options Values\r
-  The primary slave address  parameter passed to the I2C_init() function, and\r
-  secondary address value passed to the I2C_set_slave_second_addr() function,\r
-  may not have the desired effect if fixed values were selected for the slave 0\r
-  address and slave 1 address respectively. Proper operation of this version of\r
-  the driver requires the slave addresses to be programmable.\r
-\r
-  @section theory_op Theory of Operation\r
-  The CoreI2C software driver is designed to allow the control of multiple\r
-  instances of CoreI2C with one or more I2C channels. Each channel in an\r
-  instance of CoreI2C in the hardware design is associated with a single \r
-  instance of the i2c_instance_t structure in the software. You must allocate\r
-  memory for one unique i2c_instance_t structure instance for each channel of\r
-  each CoreI2C hardware instance. The contents of these data structures are\r
-  initialised during calls to I2C_init() and if necessary I2C_channel_init().\r
-  A pointer to the structure is passed to subsequent driver functions in order\r
-  to identify the CoreI2C hardware instance and channel you wish to perform the\r
-  requested operation.\r
-\r
-  Note: Do not attempt to directly manipulate the contents of i2c_instance_t\r
-       structures. These structures are only intended to be modified by the driver\r
-       functions.\r
-\r
-  The CoreI2C driver functions are grouped into the following categories:\r
-    - Initialization and configuration functions\r
-    - Interrupt control\r
-    - I2C slave addressing functions\r
-    - I2C master operations functions to handle write, read and write-read \r
-      transactions\r
-    - I2C slave operations functions to handle write, read and write-read \r
-      transactions\r
-    - Mixed master-slave operations \r
-    - SMBus interface configuration and control.\r
-    \r
-  Initialization and Configuration\r
-    The CoreI2C device is first initialized through a call to the I2C_init()\r
-    function. Since each CoreI2C peripheral supports up to 16 channels, an\r
-    additional function, I2C_channel_init(), is required to initialize the\r
-    remaining channels with their own data structures.\r
-\r
-    I2C_init() initializes channel 0 of a CoreI2C and the i2c_instance_t for\r
-    channel 0 acts as the basis for further channel initialization as the\r
-    hardware base address and I2C serial address are same across all the\r
-    channels. I2C_init() must be called before any other  I2C driver function\r
-    calls. The I2C_init() call for each CoreI2C takes the I2C serial address\r
-    assigned to the I2C and the serial clock divider to be used to generate its\r
-    I2C clock as configuration parameters. \r
-    \r
-    I2C_channel_init() takes as input parameters a pointer to the CoreI2C \r
-    i2c_instance_t which has been initialized via I2C_init() and a pointer to a\r
-    separate i2c_instance_t which represents this new channel. Another input\r
-    parameter which is required by this function is serial clock divider which\r
-    generates its I2C clock. \r
-    \r
-  Interrupt Control\r
-    The CoreI2C driver is interrupt driven and it uses each channels INT\r
-    interrupt to drive the state machine which is at the heart of the driver.\r
-    The application is responsible for providing the link between the interrupt\r
-    generating hardware and the CoreI2C interrupt handler and must ensure that\r
-    the I2C_isr() function is called with the correct i2c_instance_t structure\r
-    pointer for the CoreI2C channel initiating the interrupt.\r
-    \r
-    The driver enables and disables the generation of INT interrupts by CoreI2C\r
-    at various times when it is operating through the user supplied\r
-    I2C_enable_irq() and I2C_disable_irq() functions. \r
-    \r
-    The function I2C_register_write_handler() is used to register a write\r
-    handler function with the CoreI2C driver which is called on completion\r
-    of an I2C write transaction by the CoreI2C slave. It is the user\r
-    applications responsibility to create and register the implementation of\r
-    this handler function that processes or triggers the processing of the\r
-    received data. \r
-    \r
-    The other two interrupt sources in the CoreI2C, are related to SMBus\r
-    operation and are enabled and disabled through I2C_enable_smbus_irq() and\r
-    I2C_disable_smbus_irq() respectively. Due to the application specific\r
-    nature of the response to SMBus interrupts, you must design interrupt\r
-    handler functions in the application to get the desired behaviour for\r
-    SMBus related interrupts.\r
-    \r
-    If enabled, the SMBA_INT signal from the CoreI2C is asserted if an\r
-    SMBALERT condition is signalled on the SMBALERT_NI input for the channel.\r
-    \r
-    If enabled, the SMBS_INT signal from the CoreI2C is asserted if an\r
-    SMBSUSPEND condition is signalled on the SMBSUS_NI input for the channel.\r
-\r
-  I2C slave addressing functions\r
-    A CoreI2C peripheral can respond to three slave addresses:\r
-    - Slave address 0 - This is the primary slave address which is used for\r
-                        accessing a CoreI2C channel when it acts as a slave in\r
-                        I2C transactions. You must configure the primary slave\r
-                        address via I2C_init().\r
-                        \r
-    - Slave address 1 - This is the secondary slave address which might be\r
-                        required in certain application specific scenarios.\r
-                        The secondary slave address can be configured via\r
-                        I2C_set_slave_second_addr() and disabled via \r
-                        I2C_disable_slave_second_addr().\r
-                        \r
-    - General call address - A CoreI2C slave can be configured to respond to\r
-                        a broadcast command by a master transmitting the\r
-                        general call address of 0x00. Use the I2C_set_gca()\r
-                        function to enable the slave to respond to the general\r
-                        call address. If the CoreI2C slave is not required to\r
-                        respond to the general call address, disable this\r
-                        address by calling I2C_clear_gca().\r
-\r
-    Note: All channels on a CoreI2C instance share the same slave address logic.\r
-          This means that they cannot have separate slave addresses and rely on\r
-          the separate physical I2C bus connections to distinguish them.\r
-          \r
-  Transaction Types\r
-    The I2C driver is designed to handle three types of I2C transaction:\r
-      Write transactions\r
-      Read transactions\r
-      Write-read transactions\r
\r
-    Write transaction\r
-      The master I2C device initiates a write transaction by sending a START bit\r
-      as soon as the bus becomes free. The START bit is followed by the 7-bit\r
-      serial address of the target slave device followed by the read/write bit\r
-      indicating the direction of the transaction. The slave acknowledges the\r
-      receipt of it's address with an acknowledge bit. The master sends data one\r
-      byte at a time to the slave, which must acknowledge receipt of each byte\r
-      for the next byte to be sent. The master sends a STOP bit to complete the\r
-      transaction. The slave can abort the transaction by replying with a \r
-      non-acknowledge bit instead of an acknowledge.\r
-      \r
-      The application programmer can choose not to send a STOP bit at the end of\r
-      the transaction causing the next transaction to begin with a repeated \r
-      START bit.\r
-      \r
-    Read transaction\r
-      The master I2C device initiates a read transaction by sending a START bit\r
-      as soon as the bus becomes free. The START bit is followed by the 7-bit\r
-      serial address of the target slave device followed by the read/write bit\r
-      indicating the direction of the transaction. The slave acknowledges\r
-      receipt of it's slave address with an acknowledge bit. The slave sends\r
-      data one byte at a time to the master, which must acknowledge receipt of\r
-      each byte for the next byte to be sent. The master sends a non-acknowledge\r
-      bit following the last byte it wishes to read followed by a STOP bit.\r
-      \r
-      The application programmer can choose not to send a STOP bit at the end of\r
-      the transaction causing the next transaction to begin with a repeated \r
-      START bit.\r
\r
-    Write-read transaction\r
-      The write-read transaction is a combination of a write transaction\r
-      immediately followed by a read transaction. There is no STOP bit between\r
-      the write and read phases of a write-read transaction. A repeated START\r
-      bit is sent between the write and read phases.\r
-      \r
-      Whilst the write handler is being executed, the slave holds the clock line\r
-      low to stretch the clock until the response is ready.\r
-      \r
-      The write-read transaction is typically used to send a command or offset\r
-      in the write transaction specifying the logical data to be transferred\r
-      during the read phase.\r
-      \r
-      The application programmer can choose not to send a STOP bit at the end of\r
-      the transaction causing the next transaction to begin with a repeated\r
-      START bit.\r
-\r
-  Master Operations\r
-    The application can use the I2C_write(), I2C_read() and I2C_write_read()\r
-    functions to initiate an I2C bus transaction. The application can then wait\r
-    for the transaction to complete using the I2C_wait_complete() function\r
-    or poll the status of the I2C transaction using the I2C_get_status()\r
-    function until it returns a value different from I2C_IN_PROGRESS. The\r
-    I2C_system_tick() function can be used to set a time base for the\r
-    I2C_wait_complete() function\92s time out delay.\r
-\r
-  Slave Operations\r
-    The configuration of the  I2C driver to operate as an I2C slave requires\r
-    the use of the following functions:\r
-       I2C_set_slave_tx_buffer()\r
-       I2C_set_slave_rx_buffer()\r
-       I2C_set_slave_mem_offset_length()\r
-       I2C_register_write_handler()\r
-       I2C_enable_slave()\r
-       \r
-    Use of all functions is not required if the slave I2C does not need to support\r
-    all types of I2C read transactions. The subsequent sections list the functions\r
-    that must be used to support each transaction type. \r
-    \r
-    Responding to read transactions\r
-      The following functions are used to configure the  CoreI2C driver to\r
-      respond to I2C read transactions:\r
-        I2C_set_slave_tx_buffer()\r
-        I2C_enable_slave()\r
-        \r
-      The function I2C_set_slave_tx_buffer() specifies the data buffer that\r
-      will be transmitted when the I2C slave is the target of an I2C read\r
-      transaction. It is then up to the application to manage the content of\r
-      that buffer to control the data that will be transmitted to the I2C\r
-      master as a result of the read transaction.\r
-      \r
-      The function I2C_enable_slave() enables the  I2C hardware instance\r
-      to respond to I2C transactions. It must be called after the  I2C driver\r
-      has been configured to respond to the required transaction types.\r
-\r
-    Responding to write transactions\r
-      The following functions are used to configure the  I2C driver to respond\r
-      to I2C write transactions:\r
-        I2C_set_slave_rx_buffer()\r
-        I2C_register_write_handler()\r
-        I2C_enable_slave()\r
-        \r
-      The function I2C_set_slave_rx_buffer() specifies the data buffer that\r
-      will be used to store the data received by the I2C slave when it is the\r
-      target an I2C  write transaction.\r
-      \r
-      The function I2C_register_write_handler() specifies the handler function\r
-      that must be called on completion of the I2C write transaction. It is this\r
-      handler function that processes or triggers the processing of the received\r
-      data.\r
-      \r
-      The function I2C_enable_slave() enables the  I2C hardware instance\r
-      to respond to I2C transactions. It must be called after the  I2C driver\r
-      has been configured to respond to the required transaction types.\r
-\r
-    Responding to write-read transactions\r
-      The following functions are used to configure the CoreI2C driver to \r
-      respond to write-read transactions:\r
-        I2C_set_slave_mem_offset_length()\r
-        I2C_set_slave_tx_buffer()\r
-        I2C_set_slave_rx_buffer()\r
-        I2C_register_write_handler()\r
-        I2C_enable_slave()\r
-        \r
-      The function I2C_set_slave_mem_offset_length() specifies the number of\r
-      bytes expected by the I2C slave during the write phase of the write-read\r
-      transaction.\r
-      \r
-      The function I2C_set_slave_tx_buffer() specifies the data that will be\r
-      transmitted to the I2C master during the read phase of the write-read\r
-      transaction. The value received by the I2C slave during the write phase of\r
-      the transaction will be used as an index into the transmit buffer\r
-      specified by this function to decide which part of the transmit buffer\r
-      will be transmitted to the I2C master as part of the read phase of the\r
-      write-read transaction. \r
-      \r
-      The function I2C_set_slave_rx_buffer() specifies the data buffer that\r
-      will be used to store the data received by the I2C slave during the write\r
-      phase of the write-read transaction. This buffer must be at least large\r
-      enough to accommodate the number of bytes specified through the\r
-      I2C_set_slave_mem_offset_length() function.\r
-      \r
-      The function I2C_register_write_handler() can optionally be used to\r
-      specify a handler function that is called on completion of the write phase\r
-      of the I2C write-read transaction. If a handler function is registered, it\r
-      is responsible for processing the received data in the slave receive\r
-      buffer and populating the slave transmit buffer with the data that will be\r
-      transmitted to the I2C master as part of the read phase of the write-read\r
-      transaction.\r
-      \r
-      The function I2C_enable_slave() enables the CoreI2C hardware instance to \r
-      respond to I2C transactions. It must be called after the CoreI2C driver\r
-      has been configured to respond to the required transaction types.\r
-\r
-  Mixed Master-Slave Operations\r
-    The CoreI2C device supports mixed master and slave operations. If the \r
-    CoreI2C slave has a transaction in progress and your application attempts to\r
-    begin a master mode transaction, the CoreI2C driver queu3es the master mode\r
-    transaction until the bus is released and the CoreI2C can switch to master\r
-    mode and acquire the bus. The CoreI2C master then starts the previously\r
-    queued master transaction.\r
-    \r
-  SMBus Control\r
-    The CoreI2C driver enables the CoreI2C peripheral\92s SMBus functionality\r
-    using the I2C_smbus_init() function.\r
-    \r
-    The I2C_suspend_smbus_slave() function is used, with a master mode CoreI2C,\r
-    to force slave devices on the SMBus to enter their power-down/suspend mode.\r
-    The I2C_resume_smbus_slave() function is used to end the suspend operation\r
-    on the SMBus.\r
-    \r
-    The I2C_reset_smbus() function is used, with a master mode CoreI2C, to force\r
-    all devices on the SMBus to reset their SMBUs interface.\r
-    \r
-    The I2C_set_smsbus_alert() function is used, by a slave mode CoreI2C, to\r
-    force communication with the SMBus master. Once communications with the\r
-    master is initiated, the I2C_clear_smsbus_alert() function is used to clear\r
-    the alert condition.\r
-    \r
-    The I2C_enable_smbus_irq() and I2C_disable_smbus_irq() functions are used to\r
-    enable and disable the SMBSUS and SMBALERT SMBus interrupts.\r
-\r
- *//*=========================================================================*/\r
-\r
-#ifndef CORE_I2C_H_\r
-#define CORE_I2C_H_\r
-\r
-#include "cpu_types.h"\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif \r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_RELEASE_BUS constant is used to specify the options parameter to\r
-  functions I2C_read(), I2C_write() and I2C_write_read() to indicate\r
-  that a STOP bit must be generated at the end of the I2C transaction to release\r
-  the bus.\r
- */\r
-#define I2C_RELEASE_BUS     0x00u\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_HOLD_BUS constant is used to specify the options parameter to\r
-  functions I2C_read(), I2C_write() and I2C_write_read() to indicate\r
-  that a STOP bit must not be generated at the end of the I2C transaction in\r
-  order to retain the bus ownership. This causes the next transaction to\r
-  begin with a repeated START bit and no STOP bit between the transactions.\r
- */\r
-#define I2C_HOLD_BUS        0x01u\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The following constants specify the interrupt identifier number which will be\r
-  solely used by driver API. This has nothing to do with hardware interrupt line.\r
-  I2C_INT_IRQ is the primary interrupt signal which drives the state machine\r
-  of the CoreI2C driver. The I2C_SMBALERT_IRQ and I2C_SMBUS_IRQ are used by\r
-  SMBus interrupt enable and disable functions. These IRQ numbers are also used\r
-  by I2C_get_irq_status().\r
- */\r
-#define I2C_NO_IRQ             0x00u\r
-#define I2C_SMBALERT_IRQ       0x01u\r
-#define I2C_SMBSUS_IRQ         0x02u\r
-#define I2C_INTR_IRQ           0x04u\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_NO_TIMEOUT constant is used as parameter to the I2C_wait_complete()\r
-  function to indicate that the wait for completion of the transaction should\r
-  not time out.\r
- */\r
-#define I2C_NO_TIMEOUT  0u\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The i2c_channel_number_t type is used to specify the channel number of a\r
-  CoreI2C instance.\r
- */\r
-typedef enum i2c_channel_number {\r
-    I2C_CHANNEL_0 = 0u,\r
-    I2C_CHANNEL_1,\r
-    I2C_CHANNEL_2,\r
-    I2C_CHANNEL_3,\r
-    I2C_CHANNEL_4,\r
-    I2C_CHANNEL_5,\r
-    I2C_CHANNEL_6,\r
-    I2C_CHANNEL_7,\r
-    I2C_CHANNEL_8,\r
-    I2C_CHANNEL_9,\r
-    I2C_CHANNEL_10,\r
-    I2C_CHANNEL_11,\r
-    I2C_CHANNEL_12,\r
-    I2C_CHANNEL_13,\r
-    I2C_CHANNEL_14,\r
-    I2C_CHANNEL_15,\r
-    I2C_MAX_CHANNELS = 16u\r
-} i2c_channel_number_t;\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The i2c_clock_divider_t type is used to specify the divider to be applied\r
-  to the I2C PCLK or BCLK signal in order to generate the I2C clock.\r
-  The I2C_BCLK_DIV_8 value selects a clock frequency based on division of BCLK,\r
-  all other values select a clock frequency based on division of PCLK.\r
- */\r
-typedef enum i2c_clock_divider {\r
-    I2C_PCLK_DIV_256 = 0u,\r
-    I2C_PCLK_DIV_224,\r
-    I2C_PCLK_DIV_192,\r
-    I2C_PCLK_DIV_160,\r
-    I2C_PCLK_DIV_960,\r
-    I2C_PCLK_DIV_120,\r
-    I2C_PCLK_DIV_60,\r
-    I2C_BCLK_DIV_8\r
-} i2c_clock_divider_t;\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The i2c_status_t type is used to report the status of I2C transactions.\r
- */\r
-typedef enum i2c_status\r
-{\r
-    I2C_SUCCESS = 0u,\r
-    I2C_IN_PROGRESS,\r
-    I2C_FAILED,\r
-    I2C_TIMED_OUT\r
-} i2c_status_t;\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The i2c_slave_handler_ret_t type is used by slave write handler functions\r
-  to indicate whether or not the received data buffer should be released.\r
- */\r
-typedef enum i2c_slave_handler_ret {\r
-    I2C_REENABLE_SLAVE_RX = 0u,\r
-    I2C_PAUSE_SLAVE_RX = 1u\r
-} i2c_slave_handler_ret_t;\r
-\r
-typedef struct i2c_instance i2c_instance_t ;\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  Slave write handler functions prototype.\r
-  ------------------------------------------------------------------------------\r
-  This defines the function prototype that must be followed by  I2C slave write\r
-  handler functions. These functions are registered with the CoreI2C driver\r
-  through the I2C_register_write_handler() function.\r
-\r
-  Declaring and Implementing Slave Write Handler Functions:\r
-    Slave write handler functions should follow the following prototype:\r
-    i2c_slave_handler_ret_t write_handler\r
-    ( \r
-        i2c_instance_t *instance, uint8_t * data, uint16_t size \r
-    );\r
-\r
-    The instance parameter is a pointer to the i2c_instance_t for which this\r
-    slave write handler has been declared.\r
-    \r
-    The data parameter is a pointer to a buffer (received data buffer) holding\r
-    the data written to the I2C slave.\r
-    \r
-    Defining the macro INCLUDE_SLA_IN_RX_PAYLOAD causes the driver to insert the\r
-    actual address used to access the slave as the first byte in the buffer.\r
-    This allows applications tailor their response based on the actual address\r
-    used to access the slave (primary address, secondary address or GCA).\r
-    \r
-    The size parameter is the number of bytes held in the received data buffer.\r
-    Handler functions must return one of the following values:\r
-        I2C_REENABLE_SLAVE_RX\r
-        I2C_PAUSE_SLAVE_RX.\r
-        \r
-    If the handler function returns I2C_REENABLE_SLAVE_RX, the driver releases\r
-    the received data buffer and allows further I2C write transactions to the\r
-    I2C slave to take place.\r
-    \r
-    If the handler function returns I2C_PAUSE_SLAVE_RX, the I2C slave responds\r
-    to subsequent write requests with a non-acknowledge bit (NACK), until the\r
-    received data buffer content has been processed by some other part of the\r
-    software application.\r
-    \r
-    A call to I2C_enable_slave() is required at some point after returning\r
-    I2C_PAUSE_SLAVE_RX in order to release the received data buffer so it can\r
-    be used to store data received by subsequent I2C write transactions.\r
- */\r
-typedef i2c_slave_handler_ret_t (*i2c_slave_wr_handler_t)(i2c_instance_t *instance, uint8_t *, uint16_t );\r
-\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  i2c_instance_t\r
-  ------------------------------------------------------------------------------\r
-  This structure is used to identify the various CoreI2C hardware instances in\r
-  your system and the I2C channels within them. Your application software should\r
-  declare one instance of this structure for each channel of each instance of\r
-  CoreI2C in your system. The functions I2C_init() and I2C_channel_init() \r
-  initialize this structure depending on whether it is channel 0 or one of the\r
-  additional channels respectively. A pointer to an initialized instance of the\r
-  structure should be passed as the first parameter to the CoreI2C driver\r
-  functions, to identify which CoreI2C hardware instance and channel should\r
-  perform the requested operation.\r
-  \r
-  The contents of this data structure should not be modified or used outside of\r
-  the CoreI2C driver. Software using the CoreI2C driver should only need to \r
-  create one single instance of this data structure for each channel of each \r
-  CoreI2C hardware instance in the system then pass a pointer to these data\r
-  structures with each call to the CoreI2C driver in order to identify the\r
-  CoreI2C hardware instance it wishes to use.\r
- */\r
-struct i2c_instance\r
-{\r
-    addr_t base_address;\r
-    uint_fast8_t ser_address;\r
-\r
-    /* Transmit related info:*/\r
-    uint_fast8_t target_addr;\r
-\r
-    /* Current transaction type (WRITE, READ, RANDOM_READ)*/\r
-    uint8_t transaction;\r
-    \r
-    uint_fast16_t random_read_addr;\r
-\r
-    uint8_t options;\r
-    \r
-    /* Master TX INFO: */\r
-    const uint8_t * master_tx_buffer;\r
-    uint_fast16_t master_tx_size;\r
-    uint_fast16_t master_tx_idx;\r
-    uint_fast8_t dir;\r
-    \r
-    /* Master RX INFO: */\r
-    uint8_t * master_rx_buffer;\r
-    uint_fast16_t master_rx_size;\r
-    uint_fast16_t master_rx_idx;\r
-\r
-    /* Master Status */\r
-    volatile i2c_status_t master_status;\r
-    uint32_t master_timeout_ms;\r
-\r
-    /* Slave TX INFO */\r
-    const uint8_t * slave_tx_buffer;\r
-    uint_fast16_t slave_tx_size;\r
-    uint_fast16_t slave_tx_idx;\r
-    \r
-    /* Slave RX INFO */\r
-    uint8_t * slave_rx_buffer;\r
-    uint_fast16_t slave_rx_size;\r
-    uint_fast16_t slave_rx_idx;\r
-    /* Slave Status */\r
-    volatile i2c_status_t slave_status;\r
-    \r
-    /* Slave data: */\r
-    uint_fast8_t slave_mem_offset_length;\r
-    i2c_slave_wr_handler_t slave_write_handler;\r
-    uint8_t is_slave_enabled;\r
-    \r
-    /* user  specific data */\r
-    void *p_user_data ;\r
-\r
-    /* I2C bus status */\r
-    uint8_t bus_status;\r
-\r
-    /* Is transaction pending flag */\r
-    uint8_t is_transaction_pending;\r
-\r
-    /* I2C Pending transaction */\r
-    uint8_t pending_transaction;\r
-};\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  I2C initialization routine.\r
-  ------------------------------------------------------------------------------\r
-  The I2C_init() function is used to configure channel 0 of a CoreI2C instance.\r
-  It sets the base hardware address which is used to locate the CoreI2C instance\r
-  in memory and also used internally by I2C_channel_init() to calculate the\r
-  register addresses for any additional channels. The slave serial address set\r
-  is shared by all channels on a CoreI2C instance. \r
-  \r
-  If only one channel is configured in a CoreI2C, the address of the \r
-  i2c_instance_t used in I2C_Init() will also be used in subsequent calls to the\r
-  CoreI2C driver functions. If more than one channel is configured in the\r
-  CoreI2C, I2C_channel_init() will be called after I2C_init(), which initializes\r
-  the i2c_instance_t data structure for a specific channel.\r
-  ------------------------------------------------------------------------------\r
- @param this_i2c:\r
-    Pointer to the i2c_instance_t data structure which will hold all data\r
-    related to channel 0 of the CoreI2C instance being initialized. A pointer\r
-    to this structure will be used in all subsequent calls to CoreI2C driver\r
-    functions which are to operate on channel 0 of this CoreI2C instance.\r
-  \r
-  @param base_address:\r
-    Base address in the processor's memory map of the registers of the CoreI2C\r
-    instance being initialized.\r
\r
-  @param ser_address:\r
-    This parameter sets the primary I2C serial address (SLAVE0 address) for the\r
-    CoreI2C being initialized. It is the principal I2C bus address to which the\r
-    CoreI2C instance will respond. CoreI2C can operate in master mode or slave\r
-    mode and the serial address is significant only in the case of I2C slave\r
-    mode. In master mode, CoreI2C does not require a serial address and the\r
-    value of this parameter is not important. If you do not intend to use the\r
-    CoreI2C device in slave mode, then any dummy slave address value can be\r
-    provided to this parameter. However, in systems where the CoreI2C may be\r
-    expected to switch from master mode to slave mode, it is advisable to\r
-    initialize the CoreI2C device with a valid serial slave address.\r
-    \r
-    You need to call the I2C_init() function whenever it is required to change \r
-    the primary slave address as there is no separate function to set the\r
-    primary slave address of the I2C device. The serial address being\r
-    initialized through this function is basically the primary slave address or\r
-    slave address0. I2C_set_slave_second_addr() can be used to set the\r
-    secondary slave address or slave address 1.\r
-    Note : ser_address parameter does not have any affect if fixed slave \r
-           address is enabled in CoreI2C hardware design. CoreI2C will \r
-           be always addressed with the hardware configured fixed slave\r
-           address.\r
-    Note : ser_address parameter will not have any affect if the CoreI2C\r
-           instance is only used in master mode.\r
-\r
-  @param ser_clock_speed:\r
-    This parameter sets the I2C serial clock frequency. It selects the divider\r
-    that will be used to generate the serial clock from the APB PCLK or from\r
-    the BCLK. It can be one of the following:\r
-        I2C_PCLK_DIV_256\r
-        I2C_PCLK_DIV_224\r
-        I2C_PCLK_DIV_192\r
-        I2C_PCLK_DIV_160\r
-        I2C_PCLK_DIV_960\r
-        I2C_PCLK_DIV_120\r
-        I2C_PCLK_DIV_60\r
-        I2C_BCLK_DIV_8\r
-    Note: serial_clock_speed value will have no affect if Fixed baud rate is \r
-          enabled in CoreI2C hardware instance configuration dialogue window. \r
-          The fixed baud rate divider value will override the value\r
-          passed as parameter in this function.\r
-    Note: serial_clock_speed value is not critical for devices that only operate\r
-          as slaves and can be set to any of the above values.  \r
-\r
-  @return none.  \r
-  \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define COREI2C_SER_ADDR   0x10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    void system_init( void )\r
-    {\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_SER_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-    }\r
-  @endcode\r
- */\r
-void I2C_init\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    addr_t base_address,\r
-    uint8_t ser_address,\r
-    i2c_clock_divider_t ser_clock_speed\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  I2C channel initialization routine.\r
-  ------------------------------------------------------------------------------\r
-  The I2C_channel_init() function initializes and configures hardware and data\r
-  structures of one of the additional channels of a CoreI2C instance.\r
-  I2C_init() must be called before calling this function to set the CoreI2C\r
-  instance hardware base address and I2C serial address. I2C_channel_init() also\r
-  initializes I2C serial clock divider to set the serial clock baud rate.  \r
-  The pointer to data structure i2c_instance_t used for a particular channel\r
-  will be used as an input parameter to subsequent CoreI2C driver functions\r
-  which operate on this channel.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c_channel\r
-    Pointer to the i2c_instance_t data structure holding all data related to the\r
-    CoreI2C channel being initialized. A pointer to the same data structure will\r
-    be used in subsequent calls to the CoreI2C driver functions in order to\r
-    identify the CoreI2C channel instance that should perform the operation \r
-    implemented by the called driver function.\r
-\r
-  @param this_i2c:\r
-    This is a pointer to an i2c_instance_t structure previously initialized by\r
-    I2C_init(). It holds information regarding the hardware base address and\r
-    I2C serial address for the CoreI2C containing the channel to be\r
-    initialized. This information is required by I2C_channel_init() to\r
-    initialize the i2c_instance_t structure pointed to by this_i2c_channel as\r
-    all channels in a CoreI2C instance share the same base address and serial\r
-    address. It is very important that the i2c_instance_t structure pointed to\r
-    by this_i2c has been previously initialized with a call to I2C_init().\r
-    \r
-  @param channel_number:\r
-    This parameter of type i2c_channel_number_t identifies the channel to be\r
-    initialized.\r
-\r
-  @param ser_clock_speed:\r
-    This parameter sets the I2C serial clock frequency. It selects the divider\r
-    that will be used to generate the serial clock from the APB PCLK or from\r
-    the BCLK. It can be one of the following:\r
-        I2C_PCLK_DIV_256\r
-        I2C_PCLK_DIV_224\r
-        I2C_PCLK_DIV_192\r
-        I2C_PCLK_DIV_160\r
-        I2C_PCLK_DIV_960\r
-        I2C_PCLK_DIV_120\r
-        I2C_PCLK_DIV_60\r
-        I2C_BCLK_DIV_8\r
-    \r
-    Note: serial_clock_speed value will have no affect if Fixed baud rate is \r
-          enabled in CoreI2C hardware instance configuration dialogue window. \r
-          The fixed baud rate divider value will supersede the value \r
-          passed as parameter in this function.\r
-\r
-    Note: ser_clock_speed value is not critical for devices that only operate\r
-          as slaves and can be set to any of the above values.  \r
-  @return none.  \r
-  \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define COREI2C_SER_ADDR   0x10u\r
-    #define DATA_LENGTH        16u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-    i2c_instance_t g_i2c_channel_1_inst;\r
-\r
-    uint8_t  tx_buffer[DATA_LENGTH];\r
-    uint8_t  write_length = DATA_LENGTH;\r
-\r
-    void system_init( void )\r
-    {\r
-        uint8_t  target_slave_addr = 0x12;\r
-        \r
-        // Initialize base CoreI2C instance\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_SER_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-        \r
-        // Initialize CoreI2C channel 1 with different clock speed\r
-        I2C_channel_init( &g_i2c_channel_1_inst, &g_i2c_inst, I2C_CHANNEL_1,\r
-                          I2C_PCLK_DIV_224 );\r
-        \r
-        // Write data to Channel 1 of CoreI2C instance.\r
-        I2C_write( &g_i2c_channel_1_inst, target_slave_addr, tx_buffer,\r
-                   write_length, I2C_RELEASE_BUS );\r
-    }\r
-  @endcode\r
-          \r
-*/\r
-void I2C_channel_init\r
-(\r
-    i2c_instance_t * this_i2c_channel,\r
-    i2c_instance_t * this_i2c,\r
-    i2c_channel_number_t channel_number,\r
-    i2c_clock_divider_t ser_clock_speed\r
-);\r
-\r
-/*------------------------------------------------------------------------------\r
-  CoreI2C interrupt service routine.\r
-  ------------------------------------------------------------------------------\r
-    The function I2C_isr is the CoreI2C interrupt service routine. User must\r
-    call this function from their application level CoreI2C interrupt handler\r
-    function. This function runs the I2C state machine based on previous and \r
-    current status.\r
-  ------------------------------------------------------------------------------\r
-    @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-    \r
-    @return none\r
-    \r
-    Example:\r
-    @code\r
-    \r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define COREINTERRUPT_BASE_ADDR  0xCC000000u\r
-    #define COREI2C_SER_ADDR   0x10u\r
-    #define I2C_IRQ_NB           2u\r
-    \r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    void core_i2c_isr( void )\r
-    {\r
-       I2C_isr( &g_i2c_inst );\r
-    }\r
-    \r
-   void main( void )\r
-    {\r
-        CIC_init( COREINTERRUPT_BASE_ADDR );\r
-        NVIC_init();\r
-        CIC_set_irq_handler( I2C_IRQ_NB, core_i2c_isr );\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_SER_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-        NVIC_enable_interrupt( NVIC_IRQ_0 );\r
-    }\r
-    @endcode\r
- */\r
-void I2C_isr\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*******************************************************************************\r
- *******************************************************************************\r
- * \r
- *                           Master specific functions\r
- * \r
- * The following functions are only used within an I2C master's implementation.\r
- */\r
\r
-/*-------------------------------------------------------------------------*//**\r
-  I2C master write function.\r
-  ------------------------------------------------------------------------------\r
-  This function initiates an I2C master write transaction. This function returns\r
-  immediately after initiating the transaction. The content of the write buffer\r
-  passed as parameter should not be modified until the write transaction\r
-  completes. It also means that the memory allocated for the write buffer should\r
-  not be freed or should not go out of scope before the write completes. You can\r
-  check for the write transaction completion using the I2C_status() function.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @param serial_addr:\r
-    This parameter specifies the serial address of the target I2C device.\r
-  \r
-  @param write_buffer:\r
-    This parameter is a pointer to a buffer holding the data to be written to\r
-    the target I2C device.\r
-    Care must be taken not to release the memory used by this buffer before the\r
-    write transaction completes. For example, it is not appropriate to return\r
-    from a function allocating this buffer as an auto array variable before the\r
-    write transaction completes as this would result in the buffer's memory \r
-    being de-allocated from the stack when the function returns. This memory\r
-    could then be subsequently reused and modified causing unexpected data to \r
-    be written to the target I2C device.\r
-  \r
-  @param write_size:\r
-    Number of bytes held in the write_buffer to be written to the target I2C\r
-    device.\r
\r
-  @param options:\r
-    The options parameter is used to indicate if the I2C bus should be released\r
-    on completion of the write transaction. Using the I2C_RELEASE_BUS\r
-    constant for the options parameter causes a STOP bit to be generated at the\r
-    end of the write transaction causing the bus to be released for other I2C\r
-    devices to use. Using the I2C_HOLD_BUS constant as options parameter\r
-    prevents a STOP bit from being generated at the end of the write\r
-    transaction, preventing other I2C devices from initiating a bus transaction.\r
-  \r
-  @return none.  \r
-  \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define COREI2C_DUMMY_ADDR   0x10u\r
-    #define DATA_LENGTH           16u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    uint8_t  tx_buffer[DATA_LENGTH];\r
-    uint8_t  write_length = DATA_LENGTH;     \r
-\r
-    void main( void )\r
-    {\r
-        uint8_t  target_slave_addr = 0x12;\r
-        i2c_status_t status;\r
-        \r
-        // Initialize base CoreI2C instance\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_DUMMY_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-        \r
-        // Write data to Channel 0 of CoreI2C instance.\r
-        I2C_write( &g_i2c_inst, target_slave_addr, tx_buffer, write_length,\r
-                   I2C_RELEASE_BUS );\r
-                   \r
-        // Wait for completion and record the outcome\r
-        status = I2C_wait_complete( &g_i2c_inst, I2C_NO_TIMEOUT );\r
-    }\r
-  @endcode\r
- */\r
-void I2C_write\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t serial_addr,\r
-    const uint8_t * write_buffer,\r
-    uint16_t write_size,\r
-    uint8_t options\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  I2C master read.\r
-  ------------------------------------------------------------------------------\r
-  This function initiates an I2C master read transaction. This function returns\r
-  immediately after initiating the transaction.\r
-  The contents of the read buffer passed as parameter should not be modified\r
-  until the read transaction completes. It also means that the memory allocated\r
-  for the read buffer should not be freed or should not go out of scope before\r
-  the read completes. You can check for the read transaction completion using \r
-  the I2C_status() function.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-  \r
-  @param serial_addr:\r
-    This parameter specifies the serial address of the target I2C device.\r
-  \r
-  @param read_buffer\r
-    This is a pointer to a buffer where the data received from the target device\r
-    will be stored.\r
-    Care must be taken not to release the memory used by this buffer before the\r
-    read transaction completes. For example, it is not appropriate to return\r
-    from a function allocating this buffer as an auto array variable before the\r
-    read transaction completes as this would result in the buffer's memory being\r
-    de-allocated from the stack when the function returns. This memory could\r
-    then be subsequently reallocated resulting in the read transaction\r
-    corrupting the newly allocated memory. \r
-\r
-  @param read_size:\r
-    This parameter specifies the number of bytes to read from the target device.\r
-    This size must not exceed the size of the read_buffer buffer.\r
\r
-  @param options:\r
-    The options parameter is used to indicate if the I2C bus should be released\r
-    on completion of the read transaction. Using the I2C_RELEASE_BUS\r
-    constant for the options parameter causes a STOP bit to be generated at the\r
-    end of the read transaction causing the bus to be released for other I2C\r
-    devices to use. Using the I2C_HOLD_BUS constant as options parameter\r
-    prevents a STOP bit from being generated at the end of the read transaction,\r
-    preventing other I2C devices from initiating a bus transaction.\r
-    \r
-  @return none.  \r
-  \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define COREI2C_DUMMY_ADDR   0x10u\r
-    #define DATA_LENGTH           16u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    uint8_t  rx_buffer[DATA_LENGTH];\r
-    uint8_t  read_length = DATA_LENGTH;     \r
-\r
-    void main( void )\r
-    {\r
-        uint8_t  target_slave_addr = 0x12;\r
-        i2c_status_t status;\r
-        \r
-        // Initialize base CoreI2C instance\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_DUMMY_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-        \r
-        // Read data from target slave Channel 0 of CoreI2C instance.\r
-        I2C_read( &g_i2c_inst, target_slave_addr, rx_buffer, read_length,\r
-                  I2C_RELEASE_BUS );\r
-        \r
-        status = I2C_wait_complete( &g_i2c_inst, I2C_NO_TIMEOUT );\r
-    }\r
-  @endcode\r
- */\r
-void I2C_read\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t serial_addr,\r
-    uint8_t * read_buffer,\r
-    uint16_t read_size,\r
-    uint8_t options\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  I2C master write-read\r
-  ------------------------------------------------------------------------------\r
-  This function initiates an I2C write-read transaction where data is first\r
-  written to the target device before issuing a restart condition and changing\r
-  the direction of the I2C transaction in order to read from the target device.\r
-  \r
-  The same warnings about buffer allocation in I2C_write() and I2C_read() \r
-  apply to this function.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of\r
-    channel 0 of the instantiated CoreI2C hardware.\r
-  \r
-  @param serial_addr:\r
-    This parameter specifies the serial address of the target I2C device.\r
-  \r
-  @param addr_offset:\r
-    This parameter is a pointer to the buffer containing the data that will be\r
-    sent to the slave during the write phase of the write-read transaction. This\r
-    data is typically used to specify an address offset specifying to the I2C\r
-    slave device what data it must return during the read phase of the\r
-    write-read transaction.\r
-  \r
-  @param offset_size:\r
-    This parameter specifies the number of offset bytes to be written during the\r
-    write phase of the write-read transaction. This is typically the size of the\r
-    buffer pointed to by the addr_offset parameter.\r
-  \r
-  @param read_buffer:\r
-    This parameter is a pointer to the buffer where the data read from the I2C\r
-    slave will be stored.\r
-  \r
-  @param read_size:\r
-    This parameter specifies the number of bytes to read from the target I2C\r
-    slave device. This size must not exceed the size of the buffer pointed to by\r
-    the read_buffer parameter.\r
\r
-  @param options:\r
-    The options parameter is used to indicate if the I2C bus should be released\r
-    on completion of the write-read transaction. Using the I2C_RELEASE_BUS\r
-    constant for the options parameter causes a STOP bit to be generated at the\r
-    end of the write-read transaction causing the bus to be released for other\r
-    I2C devices to use. Using the I2C_HOLD_BUS constant as options parameter\r
-    prevents a STOP bit from being generated at the end of the write-read\r
-    transaction, preventing other I2C devices from initiating a bus transaction.\r
-        \r
-  @return none.  \r
-  \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR    0xC0000000u\r
-    #define COREI2C_DUMMY_ADDR   0x10u\r
-    #define TX_LENGTH            16u\r
-    #define RX_LENGTH            8u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-    uint8_t  rx_buffer[RX_LENGTH];\r
-    uint8_t  read_length = RX_LENGTH;     \r
-    uint8_t  tx_buffer[TX_LENGTH];\r
-    uint8_t  write_length = TX_LENGTH;  \r
-    \r
-    void main( void )\r
-    {\r
-        uint8_t  target_slave_addr = 0x12;\r
-        i2c_status_t status;\r
-        // Initialize base CoreI2C instance\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_DUMMY_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-                  \r
-        I2C_write_read( &g_i2c_inst, target_slave_addr, tx_buffer, write_length,\r
-                        rx_buffer, read_length, I2C_RELEASE_BUS );\r
-                        \r
-        status = I2C_wait_complete( &g_i2c_inst, I2C_NO_TIMEOUT );\r
-    }\r
-  @endcode\r
- */\r
-void I2C_write_read\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t serial_addr,\r
-    const uint8_t * addr_offset,\r
-    uint16_t offset_size,\r
-    uint8_t * read_buffer,\r
-    uint16_t read_size,\r
-    uint8_t options\r
-);\r
-    \r
-/*-------------------------------------------------------------------------*//**\r
-  I2C status\r
-  ------------------------------------------------------------------------------\r
-  This function indicates the current state of a CoreI2C channel.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-  ------------------------------------------------------------------------------\r
-  @return\r
-    The return value indicates the current state of a CoreI2C channel or the\r
-    outcome of the previous transaction if no transaction is in progress. \r
-    Possible return values are:\r
-      I2C_SUCCESS\r
-        The last I2C transaction has completed successfully.  \r
-      I2C_IN_PROGRESS\r
-        There is an I2C transaction in progress.\r
-      I2C_FAILED\r
-        The last I2C transaction failed.\r
-      I2C_TIMED_OUT\r
-        The request has failed to complete in the allotted time.      \r
-  \r
-  Example:\r
-  @code\r
-    i2c_instance_t g_i2c_inst;\r
-    \r
-    while( I2C_IN_PROGRESS == I2C_get_status( &g_i2c_inst ) )\r
-    {\r
-        // Do something useful while waiting for I2C operation to complete\r
-        our_i2c_busy_task();\r
-    }\r
-    \r
-    if( I2C_SUCCESS != I2C_get_status( &g_i2c_inst ) )\r
-    {\r
-        // Something went wrong... \r
-        our_i2c_error_recovery( &g_i2c_inst );\r
-    }\r
-  @endcode\r
- */\r
-i2c_status_t I2C_get_status\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  Wait for I2C transaction completion.\r
-  ------------------------------------------------------------------------------\r
-  This function waits for the current I2C transaction to complete. The return\r
-  value indicates whether the last I2C transaction was successful or not.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of\r
-    channel 0 of the instantiated CoreI2C hardware.\r
-  @param timeout_ms:\r
-    The timeout_ms parameter specified the delay within which the current I2C \r
-    transaction is expected to complete. The time out delay is given in \r
-    milliseconds. I2C_wait_complete() will return I2C_TIMED_OUT if the current\r
-    transaction has not completed after the time out delay has expired. This\r
-    parameter can be set to I2C_NO_TIMEOUT to indicate that I2C_wait_complete()\r
-    must not time out.\r
-  ------------------------------------------------------------------------------\r
-  @return\r
-    The return value indicates the outcome of the last I2C transaction. It can\r
-    be one of the following: \r
-      I2C_SUCCESS\r
-        The last I2C transaction has completed successfully.\r
-      I2C_FAILED\r
-        The last I2C transaction failed.\r
-      I2C_TIMED_OUT\r
-        The last transaction failed to complete within the time out delay given\r
-        as second parameter.\r
-\r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define COREI2C_DUMMY_ADDR   0x10u\r
-    #define DATA_LENGTH           16u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    uint8_t  rx_buffer[DATA_LENGTH];\r
-    uint8_t  read_length = DATA_LENGTH;     \r
-\r
-    void main( void )\r
-    {\r
-        uint8_t  target_slave_addr = 0x12;\r
-        i2c_status_t status;\r
-        \r
-        // Initialize base CoreI2C instance\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_DUMMY_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-        \r
-        // Read data from Channel 0 of CoreI2C instance.\r
-        I2C_read( &g_i2c_inst, target_slave_addr, rx_buffer, read_length,\r
-                  I2C_RELEASE_BUS );\r
-        \r
-        // Wait for completion and record the outcome\r
-        status = I2C_wait_complete( &g_i2c_inst, I2C_NO_TIMEOUT );\r
-    }\r
-  @endcode\r
- */\r
-i2c_status_t I2C_wait_complete\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint32_t timeout_ms\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  Time out delay expiration.\r
-  ------------------------------------------------------------------------------\r
-  This function is used to control the expiration of the time out delay\r
-  specified as a parameter to the I2C_wait_complete() function. It must be\r
-  called from the interrupt service routine of a periodic interrupt source such\r
-  as the Cortex-M3 SysTick timer interrupt. It takes the period of the interrupt\r
-  source as its ms_since_last_tick parameter and uses it as the time base for\r
-  the I2C_wait_complete() function\92s time out delay.\r
-  \r
-  Note: This function does not need to be called if the I2C_wait_complete()\r
-        function is called with a timeout_ms value of I2C_NO_TIMEOUT.\r
-  Note: If this function is not called then the I2C_wait_complete() function\r
-        will behave as if its timeout_ms was specified as I2C_NO_TIMEOUT and it\r
-        will not time out.\r
-  Note: If this function is being called from an interrupt handler (e.g SysTick)\r
-        it is important that the calling interrupt have a lower priority than\r
-        the CoreI2C interrupt(s) to ensure any updates to shared data are\r
-        protected.\r
-  \r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-  @param ms_since_last_tick:\r
-    The ms_since_last_tick parameter specifies the number of milliseconds that\r
-    elapsed since the last call to I2C_system_tick(). This parameter would\r
-    typically be a constant specifying the interrupt rate of a timer used to\r
-    generate system ticks.\r
-  ------------------------------------------------------------------------------\r
-  @return\r
-    none.\r
-\r
-  Example:\r
-    The example below shows an example of how the I2C_system_tick() function\r
-    would be called in a Cortex-M3 based system. I2C_system_tick() is called for\r
-    each I2C channel from the Cortex-M3 SysTick timer interrupt service routine.\r
-    The SysTick is configured to generate an interrupt every 10 milliseconds in\r
-    the example below.\r
-  @code\r
-    #define SYSTICK_INTERVAL_MS 10\r
-   \r
-    void SysTick_Handler(void)\r
-    {\r
-        I2C_system_tick(&g_core_i2c0, SYSTICK_INTERVAL_MS);\r
-        I2C_system_tick(&g_core_i2c2, SYSTICK_INTERVAL_MS);\r
-    }\r
-  @endcode\r
- */\r
-void I2C_system_tick\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint32_t ms_since_last_tick\r
-);\r
-\r
-/*******************************************************************************\r
- *******************************************************************************\r
- * \r
- *                           Slave specific functions\r
- * \r
- * The following functions are only used within the implementation of an I2C\r
- * slave device.\r
- */\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  I2C slave transmit buffer configuration.\r
-  ------------------------------------------------------------------------------\r
-  This function specifies the memory buffer holding the data that will be sent\r
-  to the I2C master when this CoreI2C channel is the target of an I2C read or\r
-  write-read transaction.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-  \r
-  @param tx_buffer:\r
-    This parameter is a pointer to the memory buffer holding the data to be\r
-    returned to the I2C master when this CoreI2C channel is the target of an\r
-    I2C read or write-read transaction.\r
-  \r
-  @param tx_size:\r
-    Size of the transmit buffer pointed to by the tx_buffer parameter.\r
-\r
-  @return none.  \r
-      \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR    0xC0000000u\r
-    #define SLAVE_SER_ADDR       0x10u\r
-    #define SLAVE_TX_BUFFER_SIZE 10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    uint8_t g_slave_tx_buffer[SLAVE_TX_BUFFER_SIZE] = { 1, 2, 3, 4, 5,\r
-                                                        6, 7, 8, 9, 10 };\r
-\r
-    void main( void )\r
-    {\r
-        // Initialize the CoreI2C driver with its base address, I2C serial\r
-        // address and serial clock divider.\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-       \r
-        // Specify the transmit buffer containing the data that will be\r
-        // returned to the master during read and write-read transactions.\r
-        I2C_set_slave_tx_buffer( &g_i2c_inst, g_slave_tx_buffer, \r
-                                 sizeof(g_slave_tx_buffer) );\r
-    }\r
-  @endcode\r
- */\r
-void I2C_set_slave_tx_buffer\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    const uint8_t * tx_buffer,\r
-    uint16_t tx_size\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  I2C slave receive buffer configuration.\r
-  ------------------------------------------------------------------------------\r
-  This function specifies the memory buffer that will be used by the CoreI2C\r
-  channel to receive data when it is a slave. This buffer is the memory where\r
-  data will be stored when the CoreI2C channel is the target of an I2C master\r
-  write transaction (i.e. when it is the slave).\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-  \r
-  @param rx_buffer:\r
-    This parameter is a pointer to the memory buffer allocated by the caller\r
-    software to be used as a slave receive buffer.\r
-  \r
-  @param rx_size:\r
-    Size of the slave receive buffer. This is the amount of memory that is\r
-    allocated to the buffer pointed to by rx_buffer.\r
-    Note:   This buffer size indirectly specifies the maximum I2C write\r
-            transaction length this CoreI2C channel can be the target of. This\r
-            is because this CoreI2C channel responds to further received\r
-            bytes with a non-acknowledge bit (NACK) as soon as its receive\r
-            buffer is full. This causes the write transaction to fail.\r
-            \r
-  @return none.  \r
-      \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR    0xC0000000u\r
-    #define SLAVE_SER_ADDR       0x10u\r
-    #define SLAVE_RX_BUFFER_SIZE 10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    uint8_t g_slave_rx_buffer[SLAVE_RX_BUFFER_SIZE];\r
-\r
-    void main( void )\r
-    {\r
-        // Initialize the CoreI2C driver with its base address, I2C serial\r
-        // address and serial clock divider.\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-       \r
-        // Specify the buffer used to store the data written by the I2C master.\r
-        I2C_set_slave_rx_buffer( &g_i2c_inst, g_slave_rx_buffer, \r
-                                 sizeof(g_slave_rx_buffer) );\r
-    }\r
-  @endcode\r
- */\r
-void I2C_set_slave_rx_buffer\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t * rx_buffer,\r
-    uint16_t rx_size\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  I2C slave memory offset length configuration.\r
-  ------------------------------------------------------------------------------\r
-  This function is used as part of the configuration of a CoreI2C channel for\r
-  operation as a slave supporting write-read transactions. It specifies the\r
-  number of bytes expected as part of the write phase of a write-read\r
-  transaction. The bytes received during the write phase of a write-read\r
-  transaction will be interpreted as an offset into the slave's transmit buffer.\r
-  This allows random access into the I2C slave transmit buffer from a remote\r
-  I2C master.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-  \r
-  @param offset_length:\r
-    The offset_length parameter configures the number of bytes to be interpreted\r
-    by the CoreI2C slave as a memory offset value during the write phase of\r
-    write-read transactions. The maximum value for the offset_length parameter\r
-    is two. The value of offset_length has the following effect on the \r
-    interpretation of the received data.\r
-    \r
-      If offset_length is 0, the offset into the transmit buffer is fixed at 0.\r
-      \r
-      If offset_length is 1, a single byte of received data is interpreted as an\r
-      unsigned 8 bit offset value in the range 0 to 255.\r
-      \r
-      If offset_length is 2, 2 bytes of received data are interpreted as an\r
-      unsigned 16 bit offset value in the range 0 to 65535. The first byte\r
-      received in this case provides the high order bits of the offset and\r
-      the second byte provides the low order bits.\r
-      \r
-    If the number of bytes received does not match the non 0 value of\r
-    offset_length the transmit buffer offset is set to 0.\r
-            \r
-  @return none.  \r
-      \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR    0xC0000000u\r
-    #define SLAVE_SER_ADDR       0x10u\r
-    #define SLAVE_TX_BUFFER_SIZE 10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    uint8_t g_slave_tx_buffer[SLAVE_TX_BUFFER_SIZE] = { 1, 2, 3, 4, 5,\r
-                                                        6, 7, 8, 9, 10 };\r
-\r
-    void main( void )\r
-    {\r
-        // Initialize the CoreI2C driver with its base address, I2C serial\r
-        // address and serial clock divider.\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-        I2C_set_slave_tx_buffer( &g_i2c_inst, g_slave_tx_buffer, \r
-                                 sizeof(g_slave_tx_buffer) );\r
-        I2C_set_slave_mem_offset_length( &g_i2c_inst, 1 );\r
-    }\r
-  @endcode        \r
- */\r
-void I2C_set_slave_mem_offset_length\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t offset_length\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  I2C write handler registration. \r
-  ------------------------------------------------------------------------------\r
-  Register the function that is called to process the data written to this\r
-  CoreI2C channel when it is the slave in an I2C write transaction.\r
-  Note: If a write handler is registered, it is called on completion of the\r
-        write phase of a write-read transaction and responsible for processing\r
-        the received data in the slave receive buffer and populating the slave\r
-        transmit buffer with the data that will be transmitted to the I2C master\r
-        as part of the read phase of the write-read transaction. If a write\r
-        handler is not registered, the write data of a write read transaction is\r
-        interpreted as an offset into the slave\92s transmit buffer and handled by\r
-        the driver.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-  \r
-  @param handler:\r
-    Pointer to the function that will process the I2C write request.\r
-            \r
-  @return none.  \r
-      \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR    0xC0000000u\r
-    #define SLAVE_SER_ADDR       0x10u\r
-    #define SLAVE_TX_BUFFER_SIZE 10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    uint8_t g_slave_tx_buffer[SLAVE_TX_BUFFER_SIZE] = { 1, 2, 3, 4, 5,\r
-                                                       6, 7, 8, 9, 10 };\r
-\r
-    // local function prototype\r
-    void slave_write_handler\r
-    (\r
-        i2c_instance_t * this_i2c,\r
-        uint8_t * p_rx_data,\r
-        uint16_t rx_size\r
-    );\r
-\r
-    void main( void )\r
-    {\r
-        // Initialize the CoreI2C driver with its base address, I2C serial\r
-        // address and serial clock divider.\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
-                  I2C_PCLK_DIV_256 );\r
-        I2C_set_slave_tx_buffer( &g_i2c_inst, g_slave_tx_buffer, \r
-                                 sizeof(g_slave_tx_buffer) );\r
-        I2C_set_slave_mem_offset_length( &g_i2c_inst, 1 );\r
-        I2C_register_write_handler( &g_i2c_inst, slave_write_handler );\r
-    }\r
-  @endcode    \r
-*/\r
-void I2C_register_write_handler\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    i2c_slave_wr_handler_t handler\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  I2C slave enable.\r
-  ------------------------------------------------------------------------------\r
-  This function enables slave mode operation for a CoreI2C channel. It enables \r
-  the CoreI2C slave to receive data when it is the target of an I2C read, write\r
-  or write-read transaction.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return none.\r
-\r
-  Example:\r
-  @code\r
-    // Enable I2C slave\r
-    I2C_enable_slave( &g_i2c_inst );\r
-  @endcode\r
- */\r
-void I2C_enable_slave\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  I2C slave disable.\r
-  ------------------------------------------------------------------------------\r
-  This function disables slave mode operation for a CoreI2C channel. It stops\r
-  the CoreI2C slave acknowledging I2C read, write or write-read transactions\r
-  targeted at it.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return none.\r
-\r
-  Example:\r
-  @code\r
-   // Disable I2C slave\r
-   I2C_disable_slave( &g_i2c_inst );\r
-  @endcode\r
- */\r
-void I2C_disable_slave\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-/*-------------------------------------------------------------------------*//**\r
-  Set I2C slave second address.\r
-  ------------------------------------------------------------------------------\r
-  The function I2C_set_slave_second_addr() sets the secondary slave address for\r
-  a CoreI2C slave device. This is an additional slave address which might be\r
-  required in certain applications, for example to enable fail-safe operation in\r
-  a system. As the CoreI2C device supports 7-bit addressing, the highest value\r
-  which can be assigned to second slave address is 127 (0x7F).\r
-  Note: This function does not support CoreI2C hardware configured with a fixed \r
-      second slave address.  The current implementation of the ADDR1[0] register\r
-      bit makes it difficult for the driver to support both programmable and\r
-      fixed second slave address, so we choose to support programmable only.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @param second_slave_addr:\r
-    The second_slave_addr parameter is the secondary slave address of the I2C\r
-    device.\r
-\r
-  @return\r
-    none.\r
-\r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define SLAVE_SER_ADDR     0x10u\r
-    #define SECOND_SLAVE_ADDR  0x20u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-    void main( void )\r
-    {\r
-        // Initialize the CoreI2C driver with its base address, primary I2C\r
-        // serial address and serial clock divider.\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
-                  I2C_PCLK_DIV_256 );\r
-        I2C_set_slave_second_addr( &g_i2c_inst, SECOND_SLAVE_ADDR );\r
-    }\r
-  @endcode\r
- */\r
-void I2C_set_slave_second_addr\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t second_slave_addr\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  Disable second slave address.\r
-  ------------------------------------------------------------------------------\r
-  The function I2C_disable_slave_second_addr() disables the secondary slave\r
-  address of the CoreI2C slave device. \r
-  Note: This version of the driver only supports CoreI2C hardware configured\r
-        with a programmable second slave address.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return\r
-    none.\r
-\r
-  Example:\r
-  @code\r
-    i2c_instance_t g_i2c_inst;\r
-    I2C_disable_slave_second_addr( &g_i2c_inst);\r
-  @endcode\r
- */\r
-void I2C_disable_slave_second_addr\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_set_gca() function is used to set the general call acknowledgement bit\r
-  of a CoreI2C slave device. This allows all channels of the CoreI2C slave\r
-  device respond to a general call or broadcast message from an I2C master.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return\r
-    none.\r
-\r
-  Example:\r
-  @code\r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    // Enable recognition of the General Call Address\r
-    I2C_set_gca( &g_i2c_inst ); \r
-  @endcode\r
- */\r
-void I2C_set_gca\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_clear_gca() function is used to clear the general call acknowledgement\r
-  bit of a CoreI2C slave device. This will stop all channels of the I2C slave\r
-  device responding to any general call or broadcast message from the master.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return\r
-    none.\r
-\r
-  Example:\r
-  @code\r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    // Disable recognition of the General Call Address\r
-    I2C_clear_gca( &g_i2c_inst );\r
-  @endcode\r
- */\r
-\r
-void I2C_clear_gca\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*------------------------------------------------------------------------------\r
-                      I2C SMBUS specific APIs\r
- ----------------------------------------------------------------------------*/\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_smbus_init() function enables SMBus timeouts and status logic for a\r
-  CoreI2C channel.\r
-  Note: This and any of the other SMBus related functionality will only have an\r
-        effect if the CoreI2C was instantiated with the Generate SMBus Logic\r
-        option checked.\r
-  Note: If the CoreI2C was instantiated with the Generate IPMI Logic option\r
-        checked this function will enable the IPMI 3mS SCL low timeout but none\r
-        of the other SMBus functions will have any effect.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return\r
-    none.\r
-\r
-  Example:\r
-  @code\r
-   #define COREI2C_BASE_ADDR  0xC0000000u\r
-   #define SLAVE_SER_ADDR     0x10u\r
-\r
-   i2c_instance_t g_i2c_inst;\r
-\r
-   void system_init( void )\r
-   {\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-        \r
-        // Initialize SMBus feature\r
-        I2C_smbus_init( &g_i2c_inst);\r
-   }\r
-  @endcode    \r
- */\r
-void I2C_smbus_init\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_enable_smbus_irq() function is used to enable the CoreI2C channel\92\r
-  SMBSUS and SMBALERT SMBus interrupts.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @param irq_type\r
-    The irq_type specify the SMBUS interrupt(s) which will be enabled.\r
-    The two possible interrupts are:\r
-      I2C_SMBALERT_IRQ\r
-      I2C_SMBSUS_IRQ\r
-    To enable both ints in one call, use I2C_SMBALERT_IRQ | I2C_SMBSUS_IRQ.\r
-    \r
-  @return\r
-    none\r
-  \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define SLAVE_SER_ADDR     0x10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    void main( void )\r
-    {\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-        \r
-        // Initialize SMBus feature\r
-        I2C_smbus_init( &g_i2c_inst );\r
-        \r
-        // Enable both I2C_SMBALERT_IRQ & I2C_SMBSUS_IRQ interrupts\r
-        I2C_enable_smbus_irq( &g_i2c_inst,\r
-                              (uint8_t)(I2C_SMBALERT_IRQ | I2C_SMBSUS_IRQ) );\r
-   }\r
-   @endcode\r
- */\r
-void I2C_enable_smbus_irq\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t  irq_type\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_disable_smbus_irq() function is used to disable the CoreI2C channel\92s\r
-  SMBSUS and SMBALERT SMBus interrupts.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @param irq_type\r
-    The irq_type specifies the SMBUS interrupt(s) which will be disabled.\r
-    The two possible interrupts are:\r
-      I2C_SMBALERT_IRQ\r
-      I2C_SMBSUS_IRQ\r
-    To disable both ints in one call, use I2C_SMBALERT_IRQ | I2C_SMBSUS_IRQ.\r
-\r
-  @return\r
-    none.\r
-      \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define SLAVE_SER_ADDR     0x10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-\r
-    void main( void )\r
-    {\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-        \r
-        // Initialize SMBus feature\r
-        I2C_smbus_init( &g_i2c_inst );\r
-        \r
-        // Enable both SMBALERT & SMBSUS interrupts\r
-        I2C_enable_smbus_irq( &g_i2c_inst,\r
-                              (uint8_t)(I2C_SMBALERT_IRQ | I2C_SMBSUS_IRQ));\r
-        \r
-        ...        \r
-\r
-        // Disable the SMBALERT interrupt\r
-        I2C_disable_smbus_irq( &g_i2c_inst, I2C_SMBALERT_IRQ );\r
-    }\r
-  @endcode\r
- */\r
-void I2C_disable_smbus_irq\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    uint8_t  irq_type\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The function I2C_suspend_smbus_slave() forces any SMBUS slave devices\r
-  connected to a CoreI2C channel into power down or suspend mode by asserting\r
-  the channel's SMBSUS signal. The CoreI2C channel is the SMBus master in this\r
-  case.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return\r
-    none.\r
-    \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define SLAVE_SER_ADDR     0x10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-    \r
-    void main( void )\r
-    {\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
-                  I2C_PCLK_DIV_256 );\r
-\r
-        // Initialize SMBus feature\r
-        I2C_smbus_init( &g_i2c_inst );\r
-\r
-        // suspend SMBus slaves\r
-        I2C_suspend_smbus_slave( &g_i2c_inst );\r
-\r
-        ...\r
-\r
-        // Re-enable SMBus slaves\r
-        I2C_resume_smbus_slave( &g_i2c_inst );\r
-    }\r
-  @endcode\r
- */\r
-void I2C_suspend_smbus_slave\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The function I2C_resume_smbus_slave() de-asserts the CoreI2C channel's SMBSUS\r
-  signal to take any connected slave devices out of suspend mode. The CoreI2C\r
-  channel is the SMBus master in this case.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return\r
-    none.\r
-    \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define SLAVE_SER_ADDR     0x10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-    \r
-    void main( void )\r
-    {\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
-                  I2C_PCLK_DIV_256 );\r
-\r
-        // Initialize SMBus feature\r
-        I2C_smbus_init( &g_i2c_inst );\r
-\r
-        // suspend SMBus slaves\r
-        I2C_suspend_smbus_slave( &g_i2c_inst );\r
-\r
-        ...\r
-\r
-        // Re-enable SMBus slaves\r
-        I2C_resume_smbus_slave( &g_i2c_inst );\r
-    }\r
-  @endcode\r
- */\r
-void I2C_resume_smbus_slave\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_reset_smbus() function resets the CoreI2C channel's SMBus connection\r
-  by forcing SCLK low for 35mS. The reset is automatically cleared after 35ms\r
-  have elapsed. The CoreI2C channel is the SMBus master in this case.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return\r
-    none.\r
-\r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define SLAVE_SER_ADDR     0x10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-    \r
-    void main( void )\r
-    {\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
-                  I2C_PCLK_DIV_256 );\r
-\r
-        // Initialize SMBus feature\r
-        I2C_smbus_init( &g_i2c_inst );\r
-\r
-        // Make sure the SMBus channel is in a known state by resetting it\r
-        I2C_reset_smbus( &g_i2c_inst ); \r
-    }\r
-  @endcode\r
- */\r
-void I2C_reset_smbus\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_set_smbus_alert() function is used to force master communication with\r
-  an I2C slave device by asserting the CoreI2C channel\92s SMBALERT signal. The\r
-  CoreI2C channel is the SMBus slave in this case.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return\r
-    none.\r
-\r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define SLAVE_SER_ADDR     0x10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-    \r
-    void main( void )\r
-    {\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
-                  I2C_PCLK_DIV_256 );\r
-\r
-        // Initialize SMBus feature\r
-        I2C_smbus_init( &g_i2c_inst );\r
-\r
-        // Get the SMBus masters attention\r
-        I2C_set_smbus_alert( &g_i2c_inst );\r
-\r
-        ...\r
-\r
-        // Once we are happy, drop the alert\r
-        I2C_clear_smbus_alert( &g_i2c_inst );\r
-    }\r
-  @endcode\r
- */\r
-void I2C_set_smbus_alert\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_clear_smbus_alert() function is used de-assert the CoreI2C channel\92\r
-  SMBALERT signal once a slave device has had a response from the master. The\r
-  CoreI2C channel is the SMBus slave in this case.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return\r
-    none.\r
-    \r
-  Example:\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define SLAVE_SER_ADDR     0x10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-    \r
-    void main( void )\r
-    {\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
-                  I2C_PCLK_DIV_256 );\r
-\r
-        // Initialize SMBus feature\r
-        I2C_smbus_init( &g_i2c_inst );\r
-\r
-        // Get the SMBus masters attention\r
-        I2C_set_smbus_alert( &g_i2c_inst );\r
-\r
-        ...\r
-\r
-        // Once we are happy, drop the alert\r
-        I2C_clear_smbus_alert( &g_i2c_inst );\r
-    }\r
-  @endcode\r
- */\r
-void I2C_clear_smbus_alert\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_get_irq_status function returns information on which interrupts are\r
-  currently pending in a CoreI2C channel.\r
-  The interrupts supported by CoreI2C are:\r
-    * SMBUSALERT\r
-    * SMBSUS\r
-    * INTR\r
-  The macros I2C_NO_IRQ, I2C_SMBALERT_IRQ, I2C_SMBSUS_IRQ and I2C_INTR_IRQ are\r
-  provided for use with this function.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return\r
-    This function returns the status of the CoreI2C channel\92s interrupts as a \r
-    single byte bitmap where a bit is set to indicate a pending interrupt.\r
-    The following are the bit positions associated with each interrupt type:\r
-        Bit 0 - SMBUS_ALERT_IRQ\r
-        Bit 1 - SMBSUS_IRQ\r
-        Bit 2 - INTR_IRQ\r
-    It returns 0, if there are no pending interrupts.\r
-\r
-  Example\r
-  @code\r
-   #define COREI2C_BASE_ADDR  0xC0000000u\r
-   #define SLAVE_SER_ADDR     0x10u\r
-\r
-   i2c_instance_t g_i2c_inst;\r
-   \r
-   void main( void )\r
-   {\r
-        uint8_t irq_to_enable = I2C_SMBALERT_IRQ | I2C_SMBSUS_IRQ;\r
-        uint8_t pending_irq = 0u;\r
-        \r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-\r
-        // Initialize SMBus feature\r
-        I2C_smbus_init( &g_i2c_inst );\r
-\r
-        // Enable both I2C_SMBALERT_IRQ & I2C_SMBSUS_IRQ irq\r
-        I2C_enable_smbus_irq( &g_i2c_inst, irq_to_enable );\r
-\r
-        // Get I2C IRQ type\r
-        pending_irq = I2C_get_irq_status( &g_i2c_inst );\r
-\r
-        // Let's assume, in system, INTR and SMBALERT IRQ is pending.\r
-        // So pending_irq will return status of both the IRQs\r
-\r
-        if( pending_irq & I2C_SMBALERT_IRQ )\r
-        {\r
-           // if true, it means SMBALERT_IRQ is there in pending IRQ list\r
-        }\r
-        if( pending_irq & I2C_INTR_IRQ )\r
-        {\r
-           // if true, it means I2C_INTR_IRQ is there in pending IRQ list\r
-        }\r
-   }\r
-  @endcode\r
- */\r
-uint8_t I2C_get_irq_status\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_set_user_data() function is used to allow the association of a block\r
-  of application specific data with a CoreI2C channel. The composition of the \r
-  data block is an application matter and the driver simply provides the means\r
-  for the application to set and retrieve the pointer. This may for example be\r
-  used to provide additional channel specific information to the slave write \r
-  handler.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @param p_user_data:\r
-    The p_user_data parameter is a pointer to the user specific data block for\r
-    this channel. It is defined as void * as the driver does not know the actual\r
-    type of data being pointed to and simply stores the pointer for later\r
-    retrieval by the application.\r
-\r
-  @return\r
-    none.\r
-    \r
-  Example\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define SLAVE_SER_ADDR     0x10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-    app_data_t channel_xdata;\r
-  \r
-    void main( void )\r
-    {\r
-        app_data_t *p_xdata;\r
-\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
-                  I2C_PCLK_DIV_256 );\r
-\r
-        // Store location of user data in instance structure\r
-        I2C_set_user_data( &g_i2c_inst, (void *)&channel_xdata );\r
-\r
-        ...\r
-\r
-        // Retrieve location of user data and do some work on it\r
-        p_xdata = (app_data_t *)I2C_get_user_data( &g_i2c_inst );\r
-        if( NULL != p_xdata )\r
-        {\r
-            p_xdata->foo = 123;\r
-        }\r
-    }\r
-  @endcode\r
- */\r
-void I2C_set_user_data\r
-(\r
-    i2c_instance_t * this_i2c,\r
-    void * p_user_data\r
-);\r
-\r
-/*-------------------------------------------------------------------------*//**\r
-  The I2C_get_user_data() function is used to allow the retrieval of the address\r
-  of a block of application specific data associated with a CoreI2C channel.\r
-  The composition of the data block is an application matter and the driver \r
-  simply provides the means for the application to set and retrieve the pointer.\r
-  This may for example be used to provide additional channel specific\r
-  information to the slave write handler.\r
-  ------------------------------------------------------------------------------\r
-  @param this_i2c:\r
-    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
-    holding all data related to a specific CoreI2C channel. For example, if only\r
-    one channel is initialized, this data structure holds the information of \r
-    channel 0 of the instantiated CoreI2C hardware.\r
-\r
-  @return\r
-    This function returns a pointer to the user specific data block for this \r
-    channel. It is defined as void * as the driver does not know the actual type\r
-    of data being pointed. If no user data has been registered for this channel\r
-    a NULL pointer is returned.\r
-    \r
-  Example\r
-  @code\r
-    #define COREI2C_BASE_ADDR  0xC0000000u\r
-    #define SLAVE_SER_ADDR     0x10u\r
-\r
-    i2c_instance_t g_i2c_inst;\r
-    app_data_t channel_xdata;\r
-  \r
-    void main( void )\r
-    {\r
-        app_data_t *p_xdata;\r
-\r
-        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
-                  I2C_PCLK_DIV_256 );\r
-\r
-        // Store location of user data in instance structure\r
-        I2C_set_user_data( &g_i2c_inst, (void *)&channel_xdata );\r
-\r
-        ...\r
-        \r
-        // Retrieve location of user data and do some work on it\r
-        p_xdata = (app_data_t *)I2C_get_user_data( &g_i2c_inst );\r
-        if( NULL != p_xdata )\r
-        {\r
-            p_xdata->foo = 123;\r
-        }\r
-    }\r
-  @endcode\r
- */\r
-void * I2C_get_user_data\r
-(\r
-    i2c_instance_t * this_i2c\r
-);\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_smbus_regs.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_smbus_regs.h
deleted file mode 100644 (file)
index 67da7a5..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2009-2015 Microsemi SoC Products Group.  All rights reserved.\r
- * \r
- * SVN $Revision: 7984 $\r
- * SVN $Date: 2015-10-12 12:07:40 +0530 (Mon, 12 Oct 2015) $\r
- */\r
-\r
-#ifndef __CORE_SMBUS_REGISTERS\r
-#define __CORE_SMBUS_REGISTERS    1\r
-\r
-/*------------------------------------------------------------------------------\r
- * CONTROL register details\r
- */\r
-#define CONTROL_REG_OFFSET    0x00u\r
-\r
-/*\r
- * CR0 bits.\r
- */\r
-#define CR0_OFFSET   0x00u\r
-#define CR0_MASK     0x01u\r
-#define CR0_SHIFT    0u\r
-\r
-/*\r
- * CR1 bits.\r
- */\r
-#define CR1_OFFSET   0x00u\r
-#define CR1_MASK     0x02u\r
-#define CR1_SHIFT    1u\r
-\r
-/*\r
- * AA bits.\r
- */\r
-#define AA_OFFSET   0x00u\r
-#define AA_MASK     0x04u\r
-#define AA_SHIFT    2u\r
-\r
-/*\r
- * SI bits.\r
- */\r
-#define SI_OFFSET   0x00u\r
-#define SI_MASK     0x08u\r
-#define SI_SHIFT    3u\r
-\r
-/*\r
- * STO bits.\r
- */\r
-#define STO_OFFSET   0x00u\r
-#define STO_MASK     0x10u\r
-#define STO_SHIFT    4u\r
-\r
-/*\r
- * STA bits.\r
- */\r
-#define STA_OFFSET   0x00u\r
-#define STA_MASK     0x20u\r
-#define STA_SHIFT    5u\r
-\r
-/*\r
- * ENS1 bits.\r
- */\r
-#define ENS1_OFFSET   0x00u\r
-#define ENS1_MASK     0x40u\r
-#define ENS1_SHIFT    6u\r
-\r
-/*\r
- * CR2 bits.\r
- */\r
-#define CR2_OFFSET   0x00u\r
-#define CR2_MASK     0x80u\r
-#define CR2_SHIFT    7u\r
-\r
-/*------------------------------------------------------------------------------\r
- * STATUS register details\r
- */\r
-#define STATUS_REG_OFFSET    0x04u\r
-\r
-/*------------------------------------------------------------------------------\r
- * DATA register details\r
- */\r
-#define DATA_REG_OFFSET    0x08u\r
-\r
-/*\r
- * TARGET_ADDR bits.\r
- */\r
-#define TARGET_ADDR_OFFSET    0x08u\r
-#define TARGET_ADDR_MASK      0xFEu\r
-#define TARGET_ADDR_SHIFT     1u\r
\r
-/*\r
- * DIR bit.\r
- */\r
-#define DIR_OFFSET   0x08u\r
-#define DIR_MASK     0x01u\r
-#define DIR_SHIFT    0u\r
-\r
-\r
-/*------------------------------------------------------------------------------\r
- * ADDRESS register details\r
- */\r
-#define ADDRESS_REG_OFFSET    0x0Cu\r
-\r
-/*\r
- * GC bits.\r
- */\r
-#define GC_OFFSET   0x0Cu\r
-#define GC_MASK     0x01u\r
-#define GC_SHIFT    0u\r
-\r
-/*\r
- * ADR bits.\r
- */\r
-#define OWN_SLAVE_ADDR_OFFSET   0x0Cu\r
-#define OWN_SLAVE_ADDR_MASK     0xFEu\r
-#define OWN_SLAVE_ADDR_SHIFT    1u\r
-\r
-/*------------------------------------------------------------------------------\r
- * SMBUS register details\r
- */\r
-#define SMBUS_REG_OFFSET    0x10u\r
-\r
-/*\r
- * SMBALERT_IE bits.\r
- */\r
-#define SMBALERT_IE_OFFSET   0x10u\r
-#define SMBALERT_IE_MASK     0x01u\r
-#define SMBALERT_IE_SHIFT    0u\r
-\r
-/*\r
- * SMBSUS_IE bits.\r
- */\r
-#define SMBSUS_IE_OFFSET   0x10u\r
-#define SMBSUS_IE_MASK     0x02u\r
-#define SMBSUS_IE_SHIFT    1u\r
-\r
-/*\r
- * SMB_IPMI_EN bits.\r
- */\r
-#define SMB_IPMI_EN_OFFSET   0x10u\r
-#define SMB_IPMI_EN_MASK     0x04u\r
-#define SMB_IPMI_EN_SHIFT    2u\r
-\r
-/*\r
- * SMBALERT_NI_STATUS bits.\r
- */\r
-#define SMBALERT_NI_STATUS_OFFSET   0x10u\r
-#define SMBALERT_NI_STATUS_MASK     0x08u\r
-#define SMBALERT_NI_STATUS_SHIFT    3u\r
-\r
-/*\r
- * SMBALERT_NO_CONTROL bits.\r
- */\r
-#define SMBALERT_NO_CONTROL_OFFSET   0x10u\r
-#define SMBALERT_NO_CONTROL_MASK     0x10u\r
-#define SMBALERT_NO_CONTROL_SHIFT    4u\r
-\r
-/*\r
- * SMBSUS_NI_STATUS bits.\r
- */\r
-#define SMBSUS_NI_STATUS_OFFSET   0x10u\r
-#define SMBSUS_NI_STATUS_MASK     0x20u\r
-#define SMBSUS_NI_STATUS_SHIFT    5u\r
-\r
-/*\r
- * SMBSUS_NO_CONTROL bits.\r
- */\r
-#define SMBSUS_NO_CONTROL_OFFSET   0x10u\r
-#define SMBSUS_NO_CONTROL_MASK     0x40u\r
-#define SMBSUS_NO_CONTROL_SHIFT    6u\r
-\r
-/*\r
- * SMBUS_MST_RESET bits.\r
- */\r
-#define SMBUS_MST_RESET_OFFSET   0x10u\r
-#define SMBUS_MST_RESET_MASK     0x80u\r
-#define SMBUS_MST_RESET_SHIFT    7u\r
-\r
-/*------------------------------------------------------------------------------\r
- * SLAVE ADDRESS 1 register details\r
- */\r
-\r
-#define ADDRESS1_REG_OFFSET    0x1Cu\r
-\r
-/*\r
- * SLAVE1_EN bit of Slave Address 1 .\r
- */\r
-#define SLAVE1_EN_OFFSET      0x1Cu\r
-#define SLAVE1_EN_MASK        0x01u\r
-#define SLAVE1_EN_SHIFT          0u\r
-\r
-#endif    /* __CORE_SMBUS_REGISTERS */\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreI2C/i2c_interrupt.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreI2C/i2c_interrupt.c
deleted file mode 100644 (file)
index f918b8c..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2009-2015 Microsemi SoC Products Group.  All rights reserved.\r
- * \r
- * CoreI2C driver interrupt control.\r
- * \r
- * SVN $Revision: 7984 $\r
- * SVN $Date: 2015-10-12 12:07:40 +0530 (Mon, 12 Oct 2015) $\r
- */\r
-#include "hal.h"\r
-#include "hal_assert.h"\r
-#include "core_i2c.h"\r
-#include "riscv_hal.h"\r
-\r
-\r
-#define I2C_IRQn                                           External_29_IRQn\r
-\r
-/*------------------------------------------------------------------------------\r
- * This function must be modified to enable interrupts generated from the\r
- * CoreI2C instance identified as parameter.\r
- */\r
-void I2C_enable_irq( i2c_instance_t * this_i2c )\r
-{\r
-       PLIC_EnableIRQ(I2C_IRQn);\r
-//    HAL_ASSERT(0)\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * This function must be modified to disable interrupts generated from the\r
- * CoreI2C instance identified as parameter.\r
- */\r
-void I2C_disable_irq( i2c_instance_t * this_i2c )\r
-{\r
-       PLIC_DisableIRQ(I2C_IRQn);\r
-//    HAL_ASSERT(0)\r
-}\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreTimer/core_timer.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreTimer/core_timer.c
deleted file mode 100644 (file)
index 3f6720b..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2007-2015 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * CoreTimer driver implementation.\r
- * \r
- * SVN $Revision: 7967 $\r
- * SVN $Date: 2015-10-09 18:48:26 +0530 (Fri, 09 Oct 2015) $\r
- */\r
-\r
-#include "core_timer.h"\r
-#include "coretimer_regs.h"\r
-#include "hal.h"\r
-#include "hal_assert.h"\r
-\r
-#ifndef NDEBUG\r
-static timer_instance_t* NULL_timer_instance;\r
-#endif\r
-\r
-/***************************************************************************//**\r
- * TMR_init()\r
- * See "core_timer.h" for details of how to use this function.\r
- */\r
-void \r
-TMR_init\r
-(\r
-       timer_instance_t * this_timer,\r
-       addr_t address,\r
-       uint8_t mode,\r
-       uint32_t prescale,\r
-       uint32_t load_value\r
-)\r
-{\r
-       HAL_ASSERT( this_timer != NULL_timer_instance )\r
-       HAL_ASSERT( prescale <= PRESCALER_DIV_1024 )\r
-       HAL_ASSERT( load_value != 0 )\r
-    \r
-    this_timer->base_address = address;\r
-\r
-    /* Disable interrupts. */\r
-    HAL_set_32bit_reg_field( address, InterruptEnable,0 );\r
-\r
-    /* Disable timer. */\r
-    HAL_set_32bit_reg_field( address, TimerEnable, 0 );\r
-\r
-    /* Clear pending interrupt. */\r
-    HAL_set_32bit_reg( address, TimerIntClr, 1 );\r
-\r
-    /* Configure prescaler and load value. */  \r
-    HAL_set_32bit_reg( address, TimerPrescale, prescale );\r
-    HAL_set_32bit_reg( address, TimerLoad, load_value );\r
-\r
-    /* Set the interrupt mode. */\r
-    if ( mode == TMR_CONTINUOUS_MODE )\r
-    {\r
-        HAL_set_32bit_reg_field( address, TimerMode, 0 );\r
-    }\r
-    else\r
-    {\r
-        /* TMR_ONE_SHOT_MODE */\r
-        HAL_set_32bit_reg_field( address, TimerMode, 1 );\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * TMR_start()\r
- * See "core_timer.h" for details of how to use this function.\r
- */\r
-void\r
-TMR_start\r
-(\r
-    timer_instance_t * this_timer\r
-)\r
-{\r
-       HAL_ASSERT( this_timer != NULL_timer_instance )\r
-    \r
-    HAL_set_32bit_reg_field( this_timer->base_address, TimerEnable, 1 );\r
-}\r
-\r
-/***************************************************************************//**\r
- * TMR_stop()\r
- * See "core_timer.h" for details of how to use this function.\r
- */\r
-void\r
-TMR_stop\r
-(\r
-    timer_instance_t * this_timer\r
-)\r
-{\r
-       HAL_ASSERT( this_timer != NULL_timer_instance )\r
-    \r
-    HAL_set_32bit_reg_field( this_timer->base_address, TimerEnable, 0 );\r
-}\r
-\r
-\r
-/***************************************************************************//**\r
- * TMR_enable_int()\r
- * See "core_timer.h" for details of how to use this function.\r
- */\r
-void\r
-TMR_enable_int\r
-(\r
-    timer_instance_t * this_timer\r
-)\r
-{\r
-       HAL_ASSERT( this_timer != NULL_timer_instance )\r
-    \r
-    HAL_set_32bit_reg_field( this_timer->base_address, InterruptEnable, 1 );\r
-}\r
-\r
-/***************************************************************************//**\r
- * TMR_clear_int()\r
- * See "core_timer.h" for details of how to use this function.\r
- */\r
-void\r
-TMR_clear_int\r
-(\r
-    timer_instance_t * this_timer\r
-)\r
-{\r
-       HAL_ASSERT( this_timer != NULL_timer_instance )\r
-    \r
-    HAL_set_32bit_reg( this_timer->base_address, TimerIntClr, 0x01 );\r
-}\r
-\r
-/***************************************************************************//**\r
- * TMR_current_value()\r
- * See "core_timer.h" for details of how to use this function.\r
- */\r
-uint32_t\r
-TMR_current_value\r
-(\r
-    timer_instance_t * this_timer\r
-)\r
-{\r
-       uint32_t value = 0;\r
-       HAL_ASSERT( this_timer != NULL_timer_instance )\r
-    \r
-    value = HAL_get_32bit_reg( this_timer->base_address, TimerValue );\r
-    \r
-       return value;\r
-}\r
-\r
-/***************************************************************************//**\r
- * TMR_reload()\r
- * See "core_timer.h" for details of how to use this function.\r
- */\r
-void TMR_reload\r
-(\r
-       timer_instance_t * this_timer,\r
-       uint32_t load_value\r
-)\r
-{\r
-       HAL_ASSERT( this_timer != NULL_timer_instance )\r
-       HAL_ASSERT( load_value != 0 )\r
-       \r
-       HAL_set_32bit_reg(this_timer->base_address, TimerLoad, load_value );\r
-}\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreTimer/core_timer.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreTimer/core_timer.h
deleted file mode 100644 (file)
index 04b7a6e..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2007-2015 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * CoreTimer public API.\r
- * \r
- * SVN $Revision: 7967 $\r
- * SVN $Date: 2015-10-09 18:48:26 +0530 (Fri, 09 Oct 2015) $\r
- */\r
-#ifndef CORE_TIMER_H_\r
-#define CORE_TIMER_H_\r
-\r
-#include "cpu_types.h"\r
-\r
-/***************************************************************************//**\r
- * The following definitions are used to select the CoreTimer driver operating\r
- * mode. They allow selecting continuous or one-shot mode.\r
- * 1. Continuous Mode\r
- * In continuous mode the timer's counter is decremented from the load value \r
- * until it reaches zero. The timer counter is automatically reloaded, with the\r
- * load value, upon reaching zero. An interrupt is generated every time the\r
- * counter reaches zero if interrupt is enabled.\r
- * This mode is typically used to generate an interrupt at constant time\r
- * intervals.\r
- * 2. One-shot mode: \r
- * In one-shot mode, the counter decrements from the load value and until it\r
- * reaches zero. An interrupt can be generated, if enabled, when the counter\r
- * reaches zero. The timer's counter must be reloaded to begin counting down\r
- * again.\r
- */\r
-#define TMR_CONTINUOUS_MODE            0\r
-#define TMR_ONE_SHOT_MODE              1\r
-\r
-/***************************************************************************//**\r
- * The following definitions are used to configure the CoreTimer prescaler.\r
- * The prescaler is used to divide down the clock used to decrement the\r
- * CoreTimer counter. It can be configure to divide the clock by 2, 4, 8,\r
- * 16, 32, 64, 128, 256, 512, or 1024.\r
- */\r
-#define PRESCALER_DIV_2                        0\r
-#define PRESCALER_DIV_4                        1\r
-#define PRESCALER_DIV_8                        2\r
-#define PRESCALER_DIV_16               3\r
-#define PRESCALER_DIV_32               4\r
-#define PRESCALER_DIV_64               5\r
-#define PRESCALER_DIV_128              6\r
-#define PRESCALER_DIV_256              7\r
-#define PRESCALER_DIV_512              8\r
-#define PRESCALER_DIV_1024             9\r
-\r
-/***************************************************************************//**\r
- * There should be one instance of this structure for each instance of CoreTimer\r
- * in your system. The function TMR_init() initializes this structure. It is\r
- * used to identify the various CoreTimer hardware instances in your system.\r
- * An initialized timer instance structure should be passed as first parameter to\r
- * CoreTimer driver functions to identify which CoreTimer instance should perform\r
- * the requested operation.\r
- * Software using this driver should only need to create one single instance of \r
- * this data structure for each hardware timer instance in the system.\r
- */\r
-typedef struct __timer_instance_t\r
-{\r
-       addr_t base_address;\r
-} timer_instance_t;\r
-\r
-/***************************************************************************//**\r
- * The function TMR_init() initializes the data structures and sets relevant\r
- * CoreTimer registers. This function will prepare the Timer for use in a given\r
- * hardware/software configuration. It should be called before any other Timer\r
- * API functions.\r
- * The timer will not start counting down immediately after this function is\r
- * called. It is necessary to call TMR_start() to start the timer decrementing.\r
- * The CoreTimer interrupt is disabled as part of this function.\r
- *\r
- * @param this_timer    Pointer to a timer_instance_t structure holding all \r
- *                      relevant data associated with the target timer hardware\r
- *                                             instance. This pointer will be used to identify the\r
- *                                             target CoreTimer hardware instance in subsequent calls\r
- *                                             to the CoreTimer functions.\r
- * @param address       Base address in the processor's memory map of the \r
- *                      registers of the CoreTimer instance being initialized.\r
- * @param mode          This parameter is used to select the operating mode of\r
- *                                             the timer driver. This can be either TMR_CONTINUOUS_MODE\r
- *                                             or TMR_ONE_SHOT_MODE.\r
- * @param prescale     This parameter is used to select the prescaler divider\r
- *                                             used to divide down the clock used to decrement the\r
- *                                             timer\92s counter. This can be set using one of the \r
- *                                             PRESCALER_DIV_<n> definitions, where <n> is the\r
- *                                             divider\92s value.  \r
- * @param load_value   This parameter is used to set the timer\92s load value\r
- *                                             from which the CoreTimer counter will decrement.\r
- *                                             In Continuous mode, this value will be used to reload \r
- *                                             the timer\92s counter whenever it reaches zero.\r
- */\r
-void\r
-TMR_init\r
-(\r
-       timer_instance_t * this_timer,\r
-       addr_t address,\r
-       uint8_t mode,\r
-       uint32_t prescale,\r
-       uint32_t load_value\r
-);\r
-\r
-/***************************************************************************//**\r
- * The function TMR_start() enables the timer to start counting down.\r
- * This function only needs to be called once after the timer has been\r
- * initialized through a call to TMR_init(). It does not need to be called after\r
- * each call to TMR_reload() when the timer is used in one-shot mode.\r
- *\r
- * @param this_timer    Pointer to a timer_instance_t structure holding all \r
- *                      relevant data associated with the target timer hardware\r
- *                                             instance. This pointer is used to identify the target\r
- *                                             CoreTimer hardware instance.\r
- */\r
-void\r
-TMR_start\r
-(\r
-    timer_instance_t * this_timer\r
-);\r
-\r
-/***************************************************************************//**\r
- * The function TMR_stop() stops the timer counting down. It can be used to \r
- * stop interrupts from being generated when continuous mode is used and\r
- * interrupts must be paused from being generated.\r
- *\r
- * @param this_timer    Pointer to a timer_instance_t structure holding all \r
- *                      relevant data associated with the target timer hardware\r
- *                                             instance. This pointer is used to identify the target\r
- *                                             CoreTimer hardware instance.\r
- */\r
-void\r
-TMR_stop\r
-(\r
-    timer_instance_t * this_timer\r
-);\r
-\r
-/***************************************************************************//**\r
- * The function TMR_enable_int() enables the timer interrupt. A call to this\r
- * function will allow the interrupt signal coming out of CoreTimer to be\r
- * asserted. \r
- *\r
- * @param this_timer    Pointer to a timer_instance_t structure holding all \r
- *                      relevant data associated with the target timer hardware\r
- *                                             instance. This pointer is used to identify the target\r
- *                                             CoreTimer hardware instance.\r
- */\r
-void\r
-TMR_enable_int\r
-(\r
-    timer_instance_t * this_timer\r
-);\r
-\r
-/***************************************************************************//**\r
- * The function TMR_clear_int() clears the timer interrupt. This function should\r
- * be called within the interrupt handler servicing interrupts from the timer.\r
- * Failure to clear the timer interrupt will result in the interrupt signal\r
- * generating from CoreTimer to remain asserted. This assertion may cause the\r
- * interrupt service routine to be continuously called, causing the system to\r
- * lock up.\r
- *\r
- * @param this_timer    Pointer to a timer_instance_t structure holding all \r
- *                      relevant data associated with the target timer hardware\r
- *                                             instance. This pointer is used to identify the target\r
- *                                             CoreTimer hardware instance.\r
- */\r
-void\r
-TMR_clear_int\r
-(\r
-    timer_instance_t * this_timer\r
-);\r
-\r
-/***************************************************************************//**\r
- * The TMR_current_value() function returns the current value of the counter.\r
- *\r
- * @param this_timer    Pointer to a timer_instance_t structure holding all \r
- *                      relevant data associated with the target timer hardware\r
- *                                             instance. This pointer is used to identify the target\r
- *                                             CoreTimer hardware instance.\r
- *\r
- * @return              Returns the current value of the timer counter value.\r
- */\r
-uint32_t\r
-TMR_current_value\r
-(\r
-    timer_instance_t * this_timer\r
-);\r
-\r
-/***************************************************************************//**\r
- * The TMR_reload() function is used in one-shot mode. It reloads the timer\r
- * counter with the values passed as parameter. This will result in an interrupt\r
- * being generated when the timer counter reaches 0 if interrupt is enabled.\r
- * \r
- * @param this_timer    Pointer to a timer_instance_t structure holding all \r
- *                      relevant data associated with the target timer hardware\r
- *                                             instance. This pointer is used to identify the target\r
- *                                             CoreTimer hardware instance.\r
- * @param load_value   This parameter sets the value from which the CoreTimer\r
- *                                             counter will decrement. \r
- */\r
-void TMR_reload\r
-(\r
-       timer_instance_t * this_timer,\r
-       uint32_t load_value\r
-);\r
-       \r
-#endif /* CORE_TIMER_H_ */\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreTimer/coretimer_regs.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreTimer/coretimer_regs.h
deleted file mode 100644 (file)
index 5d7c67d..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2007-2015 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * SVN $Revision: 7967 $\r
- * SVN $Date: 2015-10-09 18:48:26 +0530 (Fri, 09 Oct 2015) $\r
- */\r
-\r
-#ifndef __CORE_TIMER_REGISTERS\r
-#define __CORE_TIMER_REGISTERS 1\r
-\r
-/*------------------------------------------------------------------------------\r
- * TimerLoad register details\r
- */\r
-#define TimerLoad_REG_OFFSET   0x00\r
-\r
-/*\r
- * LoadValue bits.\r
- */\r
-#define LoadValue_OFFSET   0x00\r
-#define LoadValue_MASK     0xFFFFFFFF\r
-#define LoadValue_SHIFT    0\r
-\r
-/*------------------------------------------------------------------------------\r
- * TimerValue register details\r
- */\r
-#define TimerValue_REG_OFFSET  0x04\r
-\r
-/*\r
- * CurrentValue bits.\r
- */\r
-#define CurrentValue_OFFSET   0x04\r
-#define CurrentValue_MASK     0xFFFFFFFF\r
-#define CurrentValue_SHIFT    0\r
-\r
-/*------------------------------------------------------------------------------\r
- * TimerControl register details\r
- */\r
-#define TimerControl_REG_OFFSET        0x08\r
-\r
-/*\r
- * TimerEnable bits.\r
- */\r
-#define TimerEnable_OFFSET   0x08\r
-#define TimerEnable_MASK     0x00000001\r
-#define TimerEnable_SHIFT    0\r
-\r
-/*\r
- * InterruptEnable bits.\r
- */\r
-#define InterruptEnable_OFFSET   0x08\r
-#define InterruptEnable_MASK     0x00000002\r
-#define InterruptEnable_SHIFT    1\r
-\r
-/*\r
- * TimerMode bits.\r
- */\r
-#define TimerMode_OFFSET   0x08\r
-#define TimerMode_MASK     0x00000004\r
-#define TimerMode_SHIFT    2\r
-\r
-/*------------------------------------------------------------------------------\r
- * TimerPrescale register details\r
- */\r
-#define TimerPrescale_REG_OFFSET       0x0C\r
-\r
-/*\r
- * Prescale bits.\r
- */\r
-#define Prescale_OFFSET   0x0C\r
-#define Prescale_MASK     0x0000000F\r
-#define Prescale_SHIFT    0\r
-\r
-/*------------------------------------------------------------------------------\r
- * TimerIntClr register details\r
- */\r
-#define TimerIntClr_REG_OFFSET 0x10\r
-\r
-/*\r
- * TimerIntClr bits.\r
- */\r
-#define TimerIntClr_OFFSET   0x10\r
-#define TimerIntClr_MASK     0xFFFFFFFF\r
-#define TimerIntClr_SHIFT    0\r
-\r
-/*------------------------------------------------------------------------------\r
- * TimerRIS register details\r
- */\r
-#define TimerRIS_REG_OFFSET    0x14\r
-\r
-/*\r
- * RawTimerInterrupt bits.\r
- */\r
-#define RawTimerInterrupt_OFFSET   0x14\r
-#define RawTimerInterrupt_MASK     0x00000001\r
-#define RawTimerInterrupt_SHIFT    0\r
-\r
-/*------------------------------------------------------------------------------\r
- * TimerMIS register details\r
- */\r
-#define TimerMIS_REG_OFFSET    0x18\r
-\r
-/*\r
- * TimerInterrupt bits.\r
- */\r
-#define TimerInterrupt_OFFSET   0x18\r
-#define TimerInterrupt_MASK     0x00000001\r
-#define TimerInterrupt_SHIFT    0\r
-\r
-#endif /* __CORE_TIMER_REGISTERS */\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/core_uart_apb.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/core_uart_apb.c
deleted file mode 100644 (file)
index b4f40dc..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2007-2017 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * CoreUARTapb driver implementation. See file "core_uart_apb.h" for a\r
- * description of the functions implemented in this file.\r
- * \r
- * SVN $Revision: 9082 $\r
- * SVN $Date: 2017-04-28 11:51:36 +0530 (Fri, 28 Apr 2017) $\r
- */\r
-#include "hal.h"\r
-#include "coreuartapb_regs.h"\r
-#include "core_uart_apb.h"\r
-#include "hal_assert.h"\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-#define NULL_INSTANCE ( ( UART_instance_t* ) 0 )\r
-#define NULL_BUFFER   ( ( uint8_t* ) 0 )\r
-\r
-#define MAX_LINE_CONFIG     ( ( uint8_t )( DATA_8_BITS | ODD_PARITY ) )\r
-#define MAX_BAUD_VALUE      ( ( uint16_t )( 0x1FFF ) )\r
-#define STATUS_ERROR_MASK   ( ( uint8_t )( STATUS_PARITYERR_MASK | \\r
-                                           STATUS_OVERFLOW_MASK  | \\r
-                                           STATUS_FRAMERR_MASK ) )\r
-#define BAUDVALUE_LSB ( (uint16_t) (0x00FF) )\r
-#define BAUDVALUE_MSB ( (uint16_t) (0xFF00) )\r
-#define BAUDVALUE_SHIFT ( (uint8_t) (5) )\r
-\r
-#define STATUS_ERROR_OFFSET STATUS_PARITYERR_SHIFT \r
-\r
-/***************************************************************************//**\r
- * UART_init()\r
- * See "core_uart_apb.h" for details of how to use this function.\r
- */\r
-void\r
-UART_init\r
-(\r
-    UART_instance_t * this_uart,\r
-    addr_t base_addr,\r
-    uint16_t baud_value,\r
-    uint8_t line_config\r
-)\r
-{\r
-    uint8_t rx_full;\r
-    \r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    HAL_ASSERT( line_config <= MAX_LINE_CONFIG )\r
-    HAL_ASSERT( baud_value <= MAX_BAUD_VALUE )\r
-\r
-    if( ( this_uart != NULL_INSTANCE ) &&\r
-        ( line_config <= MAX_LINE_CONFIG ) &&\r
-        ( baud_value <= MAX_BAUD_VALUE ) )\r
-    {\r
-        /*\r
-         * Store lower 8-bits of baud value in CTRL1.\r
-         */\r
-        HAL_set_8bit_reg( base_addr, CTRL1, (uint_fast8_t)(baud_value &\r
-                                                       BAUDVALUE_LSB ) );\r
-    \r
-        /*\r
-         * Extract higher 5-bits of baud value and store in higher 5-bits \r
-         * of CTRL2, along with line configuration in lower 3 three bits.\r
-         */\r
-        HAL_set_8bit_reg( base_addr, CTRL2, (uint_fast8_t)line_config | \r
-                                           (uint_fast8_t)((baud_value &\r
-                                   BAUDVALUE_MSB) >> BAUDVALUE_SHIFT ) );\r
-    \r
-        this_uart->base_address = base_addr;\r
-#ifndef NDEBUG\r
-        {\r
-            uint8_t  config;\r
-            uint8_t  temp;\r
-            uint16_t baud_val;\r
-            baud_val = HAL_get_8bit_reg( this_uart->base_address, CTRL1 );\r
-            config =  HAL_get_8bit_reg( this_uart->base_address, CTRL2 );\r
-            /*\r
-             * To resolve operator precedence between & and <<\r
-             */\r
-            temp =  ( config  &  (uint8_t)(CTRL2_BAUDVALUE_MASK ) );\r
-            baud_val |= (uint16_t)( (uint16_t)(temp) << BAUDVALUE_SHIFT );\r
-            config &= (uint8_t)(~CTRL2_BAUDVALUE_MASK);\r
-            HAL_ASSERT( baud_val == baud_value );\r
-            HAL_ASSERT( config == line_config );\r
-        }        \r
-#endif\r
-        \r
-        /*\r
-         * Flush the receive FIFO of data that may have been received before the\r
-         * driver was initialized.\r
-         */\r
-        rx_full = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &\r
-                                                    STATUS_RXFULL_MASK;\r
-        while ( rx_full )\r
-        {\r
-            HAL_get_8bit_reg( this_uart->base_address, RXDATA );\r
-            rx_full = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &\r
-                                                        STATUS_RXFULL_MASK;\r
-        }\r
-\r
-        /*\r
-         * Clear status of the UART instance.\r
-         */\r
-        this_uart->status = (uint8_t)0;\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_send()\r
- * See "core_uart_apb.h" for details of how to use this function.\r
- */\r
-void\r
-UART_send\r
-(\r
-    UART_instance_t * this_uart,\r
-    const uint8_t * tx_buffer,\r
-    size_t tx_size\r
-)\r
-{\r
-    size_t char_idx;\r
-    uint8_t tx_ready;\r
-\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    HAL_ASSERT( tx_buffer != NULL_BUFFER )\r
-    HAL_ASSERT( tx_size > 0 )\r
-      \r
-    if( (this_uart != NULL_INSTANCE) &&\r
-        (tx_buffer != NULL_BUFFER)   &&\r
-        (tx_size > (size_t)0) )\r
-    {\r
-        for ( char_idx = (size_t)0; char_idx < tx_size; char_idx++ )\r
-        {\r
-            /* Wait for UART to become ready to transmit. */\r
-            do {\r
-                tx_ready = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &\r
-                                                              STATUS_TXRDY_MASK;\r
-            } while ( !tx_ready );\r
-            /* Send next character in the buffer. */\r
-            HAL_set_8bit_reg( this_uart->base_address, TXDATA,\r
-                              (uint_fast8_t)tx_buffer[char_idx] );\r
-        }\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_fill_tx_fifo()\r
- * See "core_uart_apb.h" for details of how to use this function.\r
- */\r
-size_t\r
-UART_fill_tx_fifo\r
-(\r
-    UART_instance_t * this_uart,\r
-    const uint8_t * tx_buffer,\r
-    size_t tx_size\r
-)\r
-{\r
-    uint8_t tx_ready;\r
-    size_t size_sent = 0u;\r
-    \r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    HAL_ASSERT( tx_buffer != NULL_BUFFER )\r
-    HAL_ASSERT( tx_size > 0 )\r
-      \r
-    /* Fill the UART's Tx FIFO until the FIFO is full or the complete input \r
-     * buffer has been written. */\r
-    if( (this_uart != NULL_INSTANCE) &&\r
-        (tx_buffer != NULL_BUFFER)   &&\r
-        (tx_size > 0u) )\r
-    {\r
-        tx_ready = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &\r
-                                                      STATUS_TXRDY_MASK;\r
-        if ( tx_ready )\r
-        {\r
-            do {\r
-                HAL_set_8bit_reg( this_uart->base_address, TXDATA,\r
-                                  (uint_fast8_t)tx_buffer[size_sent] );\r
-                size_sent++;\r
-                tx_ready = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &\r
-                                                              STATUS_TXRDY_MASK;\r
-            } while ( (tx_ready) && ( size_sent < tx_size ) );\r
-        }\r
-    }    \r
-    return size_sent;\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_get_rx()\r
- * See "core_uart_apb.h" for details of how to use this function.\r
- */\r
-size_t\r
-UART_get_rx\r
-(\r
-    UART_instance_t * this_uart,\r
-    uint8_t * rx_buffer,\r
-    size_t buff_size\r
-)\r
-{\r
-    uint8_t new_status;\r
-    uint8_t rx_full;\r
-    size_t rx_idx = 0u;\r
-    \r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    HAL_ASSERT( rx_buffer != NULL_BUFFER )\r
-    HAL_ASSERT( buff_size > 0 )\r
-      \r
-    if( (this_uart != NULL_INSTANCE) &&\r
-        (rx_buffer != NULL_BUFFER)   &&\r
-        (buff_size > 0u) )\r
-    {\r
-        rx_idx = 0u;\r
-        new_status = HAL_get_8bit_reg( this_uart->base_address, STATUS );\r
-        this_uart->status |= new_status;\r
-        rx_full = new_status & STATUS_RXFULL_MASK;\r
-        while ( ( rx_full ) && ( rx_idx < buff_size ) )\r
-        {\r
-            rx_buffer[rx_idx] = HAL_get_8bit_reg( this_uart->base_address,\r
-                                                  RXDATA );\r
-            rx_idx++;\r
-            new_status = HAL_get_8bit_reg( this_uart->base_address, STATUS );\r
-            this_uart->status |= new_status;\r
-            rx_full = new_status & STATUS_RXFULL_MASK;\r
-        }\r
-    }\r
-    return rx_idx;\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_polled_tx_string()\r
- * See "core_uart_apb.h" for details of how to use this function.\r
- */\r
-void \r
-UART_polled_tx_string\r
-( \r
-    UART_instance_t * this_uart, \r
-    const uint8_t * p_sz_string\r
-)\r
-{\r
-    uint32_t char_idx;\r
-    uint8_t tx_ready;\r
-\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    HAL_ASSERT( p_sz_string != NULL_BUFFER )\r
-    \r
-    if( ( this_uart != NULL_INSTANCE ) && ( p_sz_string != NULL_BUFFER ) )\r
-    {\r
-        char_idx = 0U;\r
-        while( 0U != p_sz_string[char_idx] )\r
-        {\r
-            /* Wait for UART to become ready to transmit. */\r
-            do {\r
-                tx_ready = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &\r
-                                                              STATUS_TXRDY_MASK;\r
-            } while ( !tx_ready );\r
-            /* Send next character in the buffer. */\r
-            HAL_set_8bit_reg( this_uart->base_address, TXDATA,\r
-                              (uint_fast8_t)p_sz_string[char_idx] );\r
-            char_idx++;\r
-        }\r
-    }\r
-}\r
-\r
-/***************************************************************************//**\r
- * UART_get_rx_status()\r
- * See "core_uart_apb.h" for details of how to use this function.\r
- */\r
-uint8_t\r
-UART_get_rx_status\r
-(\r
-    UART_instance_t * this_uart\r
-)\r
-{\r
-    uint8_t status = UART_APB_INVALID_PARAM;\r
-\r
-    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
-    /*\r
-     * Extract UART error status and place in lower bits of "status".\r
-     * Bit 0 - Parity error status\r
-     * Bit 1 - Overflow error status\r
-     * Bit 2 - Frame error status\r
-     */\r
-    if( this_uart != NULL_INSTANCE )\r
-    {\r
-        status = ( ( this_uart->status & STATUS_ERROR_MASK ) >> \r
-                                          STATUS_ERROR_OFFSET );\r
-        /*\r
-         * Clear the sticky status for this instance.\r
-         */\r
-        this_uart->status = (uint8_t)0;\r
-    }\r
-    return status;\r
-}\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/core_uart_apb.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/core_uart_apb.h
deleted file mode 100644 (file)
index 680b68d..0000000
+++ /dev/null
@@ -1,407 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2007-2017 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * This file contains the application programming interface for the CoreUARTapb\r
- * bare metal driver.\r
- * \r
- * SVN $Revision: 9082 $\r
- * SVN $Date: 2017-04-28 11:51:36 +0530 (Fri, 28 Apr 2017) $\r
- */\r
-/*=========================================================================*//**\r
-  @mainpage CoreUARTapb Bare Metal Driver.\r
-\r
-  @section intro_sec Introduction\r
-  CoreUARTapb is an implementation of the Universal Asynchronous \r
-  Receiver/Transmitter aimed at a minimal FPGA tile usage within an Microsemi\r
-  FPGA. The CoreUARTapb bare metal software driver is designed for use in \r
-  systems with no operating system.\r
-\r
-  The CoreUARTapb driver provides functions for basic polled transmitting and \r
-  receiving operations. It also provides functions allowing use of the \r
-  CoreUARTapb in interrupt-driven mode, but leaves the management of interrupts \r
-  to the calling application, as interrupt enabling and disabling cannot be \r
-  controlled through the CoreUARTapb registers. The CoreUARTapb driver is \r
-  provided as C source code.\r
-\r
-  @section driver_configuration Driver Configuration\r
-  Your application software should configure the CoreUARTapb driver, through \r
-  calls to the UART_init() function for each CoreUARTapb instance in the \r
-  hardware design. The configuration parameters include the CoreUARTapb \r
-  hardware instance base address and other runtime parameters, such as baud \r
-  rate, bit width, and parity. No CoreUARTapb hardware configuration parameters \r
-  are needed by the driver, apart from the CoreUARTapb hardware instance base \r
-  address. Hence, no additional configuration files are required to use the driver.\r
-\r
-  A CoreUARTapb hardware instance can be generated with fixed baud value, \r
-  character size and parity configuration settings as part of the hardware flow. \r
-  The baud_value and line_config parameter values passed to the UART_init() \r
-  function will not have any effect if fixed values were selected for the \r
-  baud value, character size and parity in the hardware configuration of \r
-  CoreUARTapb. When fixed values are selected for these hardware configuration \r
-  parameters, the driver cannot overwrite the fixed values in the CoreUARTapb \r
-  control registers, CTRL1 and CTRL2.\r
-\r
-  @section theory_op Theory of Operation\r
-  The CoreUARTapb software driver is designed to allow the control of multiple \r
-  instances of CoreUARTapb. Each instance of CoreUARTapb in the hardware design \r
-  is associated with a single instance of the UART_instance_t structure in the \r
-  software. You need to allocate memory for one unique UART_instance_t  \r
-  structure instance for each CoreUARTapb hardware instance. The contents of \r
-  these data structures are initialized during calls to function UART_init(). \r
-  A pointer to the structure is passed to subsequent driver functions in order\r
-  to identify the CoreUARTapb hardware instance you wish to perform the \r
-  requested operation on.\r
-  \r
-  Note: Do not attempt to directly manipulate the content of UART_instance_t \r
-  structures. This structure is only intended to be modified by the driver \r
-  function.\r
-\r
-  The driver can be used to transmit and receive data once initialized. \r
-  Transmit can be performed using the UART_send() function. This function\r
-  is blocking, meaning that it will only return once the data passed to \r
-  the function has been sent to the CoreUARTapb hardware. Data received \r
-  by the CoreUARTapb hardware can be read by the user application using \r
-  the UART_get_rx() function.\r
-\r
-  The function UART_fill_tx_fifo() is also provided to be used as part of \r
-  interrupt-driven transmit. This function fills the CoreUARTapb hardware \r
-  transmit FIFO with the content of a data buffer passed as a parameter before \r
-  returning. The control of the interrupts must be implemented outside the \r
-  driver as the CoreUARTapb hardware does not provide the ability to enable \r
-  or disable its interrupt sources.\r
-\r
-  The function UART_polled_tx_string() is provided to transmit a NULL \r
-  terminated string in polled mode. This function is blocking, meaning that it \r
-  will only return once the data passed to the function has been sent to the \r
-  CoreUARTapb hardware.\r
-\r
-  The function UART_get_rx_status() returns the error status of the CoreUARTapb\r
-  receiver. This can be used by applications to take appropriate action in case\r
-  of receiver errors.\r
-*//*=========================================================================*/\r
-#ifndef __CORE_UART_APB_H\r
-#define __CORE_UART_APB_H 1\r
-\r
-#include "cpu_types.h"\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-/***************************************************************************//**\r
- * Data bits length defines:\r
- */\r
-#define DATA_7_BITS     0x00u\r
-#define DATA_8_BITS     0x01u\r
-\r
-/***************************************************************************//**\r
- * Parity defines:\r
- */\r
-#define NO_PARITY       0x00u\r
-#define EVEN_PARITY     0x02u\r
-#define ODD_PARITY      0x06u\r
-\r
-/***************************************************************************//**\r
- * Error Status definitions:\r
- */\r
-#define UART_APB_PARITY_ERROR    0x01u\r
-#define UART_APB_OVERFLOW_ERROR  0x02u\r
-#define UART_APB_FRAMING_ERROR   0x04u\r
-#define UART_APB_NO_ERROR        0x00u\r
-#define UART_APB_INVALID_PARAM   0xFFu\r
-\r
-/***************************************************************************//**\r
- * UART_instance_t\r
- * \r
- * There should be one instance of this structure for each instance of CoreUARTapb\r
- * in your system. This structure instance is used to identify the various UARTs\r
- * in a system and should be passed as first parameter to UART functions to \r
- * identify which UART should perform the requested operation. The 'status' \r
- * element in the structure is used to provide sticky status information. \r
- */\r
-typedef struct\r
-{\r
-    addr_t      base_address;\r
-    uint8_t     status;\r
-} UART_instance_t;\r
-\r
-/***************************************************************************//**\r
- * The function UART_init() initializes the UART with the configuration passed \r
- * as parameters. The configuration parameters are the baud_value used to \r
- * generate the baud rate and the line configuration (bit length and parity).\r
- *\r
- * @param this_uart   The this_uart parameter is a pointer to a UART_instance_t\r
- *                    structure which holds all data regarding this instance of\r
- *                    the CoreUARTapb. This pointer will be used to identify \r
- *                    the target CoreUARTapb hardware instance in subsequent \r
- *                    calls to the CoreUARTapb functions.\r
- * @param base_addr   The base_address parameter is the base address in the \r
- *                    processor's memory map for the registers of the \r
- *                    CoreUARTapb instance being initialized.\r
- * @param baud_value  The baud_value parameter is used to select the baud rate \r
- *                    for the UART. The baud value is calculated from the \r
- *                    frequency of the system clock in hertz and the desired \r
- *                    baud rate using the following equation: \r
- *                    \r
- *                    baud_value = (clock /(baud_rate * 16)) - 1.\r
- * \r
- *                    The baud_value parameter must be a value in the range 0 \r
- *                    to 8191 (or 0x0000 to 0x1FFF).\r
- * @param line_config This parameter is the line configuration specifying the \r
- *                    bit length and parity settings. This is a logical OR of:\r
- *                      - DATA_7_BITS\r
- *                    - DATA_8_BITS\r
- *                    - NO_PARITY\r
- *                    - EVEN_PARITY\r
- *                    - ODD_PARITY\r
- *                    For example, 8 bits even parity would be specified as \r
- *                    (DATA_8_BITS | EVEN_PARITY). \r
- * @return            This function does not return a value.\r
- * Example:\r
- * @code\r
- *   #define BAUD_VALUE_57600    25\r
- *   \r
- *   #define COREUARTAPB0_BASE_ADDR      0xC3000000UL\r
- *   \r
- *   UART_instance_t g_uart;\r
- *   int main()\r
- *   {\r
- *      UART_init(&g_uart, COREUARTAPB0_BASE_ADDR, \r
-                  BAUD_VALUE_57600, (DATA_8_BITS | EVEN_PARITY));\r
- *   }\r
- * @endcode\r
- */\r
-void\r
-UART_init\r
-(\r
-    UART_instance_t * this_uart,\r
-    addr_t base_addr,\r
-    uint16_t baud_value,\r
-    uint8_t line_config\r
-);\r
-\r
-/***************************************************************************//**\r
- * The function UART_send() is used to transmit data. It transfers the contents\r
- * of the transmitter data buffer, passed as a function parameter, into the \r
- * UART's hardware transmitter FIFO. It returns when the full content of the \r
- * transmitter data buffer has been transferred to the UART's transmitter FIFO. \r
- *\r
- * Note: you cannot assume that the data you are sending using this function has\r
- * been received at the other end by the time this function returns. The actual\r
- * transmit over the serial connection will still be taking place at the time of\r
- * the function return. It is safe to release or reuse the memory used as the\r
- * transmit buffer once this function returns.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a \r
- *                      UART_instance_t structure which holds all data regarding \r
- *                      this instance of the CoreUARTapbUART.\r
- * @param tx_buffer     The tx_buffer parameter is a pointer to a buffer \r
- *                      containing the data to be transmitted.\r
- * @param tx_size       The tx_size parameter is the size, in bytes, of \r
- *                      the data to be transmitted.\r
- *\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- *   uint8_t testmsg1[] = {"\n\r\n\r\n\rUART_send() test message 1"};\r
- *   UART_send(&g_uart,(const uint8_t *)&testmsg1,sizeof(testmsg1));\r
- * @endcode\r
- */\r
-void\r
-UART_send\r
-(\r
-    UART_instance_t * this_uart,\r
-    const uint8_t * tx_buffer,\r
-    size_t tx_size\r
-);\r
-\r
-/***************************************************************************//**\r
- * The function UART_fill_tx_fifo() fills the UART's transmitter hardware FIFO \r
- * with the data found in the transmitter buffer that is passed in as a \r
- * function parameter. The function returns either when the FIFO is full or \r
- * when the complete contents of the transmitter buffer have been copied into \r
- * the FIFO. It returns the number of bytes copied into the UART's transmitter\r
- * hardware FIFO. This function is intended to be used as part of \r
- * interrupt-driven transmission.\r
- *\r
- * Note:    You cannot assume that the data you transmit using this function has \r
- *          been received at the other end by the time this function returns. \r
- *          The actual transmission over the serial connection will still be \r
- *          taking place at the time of the function return. \r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a UART_instance_t\r
- *                      structure which holds all data regarding this instance of\r
- *                      the UART.\r
- * @param tx_buffer     The tx_buffer parameter is a pointer to a buffer \r
- *                      containing the data to be transmitted.\r
- * @param tx_size       The tx_size parameter is the size in bytes, of the data \r
- *                      to be transmitted.\r
- * @return              This function returns the number of bytes copied \r
- *                      into the UART's transmitter hardware FIFO. \r
- *\r
- * Example:\r
- * @code\r
- *   void send_using_interrupt\r
- *   (\r
- *       uint8_t * pbuff,\r
- *       size_t tx_size\r
- *   )\r
- *   {\r
- *       size_t size_in_fifo;\r
- *       size_in_fifo = UART_fill_tx_fifo( &g_uart, pbuff, tx_size );\r
- *   }\r
- * @endcode\r
- */\r
-size_t\r
-UART_fill_tx_fifo\r
-(\r
-    UART_instance_t * this_uart,\r
-    const uint8_t * tx_buffer,\r
-    size_t tx_size\r
-);\r
-\r
-/***************************************************************************//**\r
- * The function UART_get_rx() reads the content of the UART's receiver hardware \r
- * FIFO and stores it in the receiver buffer that is passed in as a function \r
- * parameter. It copies either the full contents of the FIFO into the receiver \r
- * buffer, or just enough data from the FIFO to fill the receiver buffer, \r
- * dependent upon the size of the receiver buffer.  The size of the receiver \r
- * buffer is passed in as a function parameter. UART_get_rx() returns the number\r
- * of bytes copied into the receiver buffer. If no data was received at the time\r
- * the function is called, the function returns 0.\r
- *\r
- * Note:    This function reads and accumulates the receiver status of the \r
- *          CoreUARTapb instance before reading each byte from the receiver's \r
- *          data register/FIFO. This allows the driver to maintain a sticky \r
- *          record of any receiver errors that occur as the UART receives each \r
- *          data byte; receiver errors would otherwise be lost after each read \r
- *          from the receiver's data register. A call to the UART_get_rx_status()\r
- *          function returns any receiver errors accumulated during the execution\r
- *          of the UART_get_rx() function.\r
- * Note:    When FIFO mode is disabled in the CoreUARTapb hardware configuration,\r
- *          the driver accumulates a sticky record of any parity errors, framing \r
- *          errors or overflow errors. When FIFO mode is enabled, the driver \r
- *          accumulates a sticky record of overflow errors only; in this case \r
- *          interrupts must be used to handle parity errors or framing errors.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a UART_instance_t \r
- *                      structure which holds all data regarding this instance of \r
- *                      the UART.\r
- * @param rx_buffer     The rx_buffer parameter is a pointer to a buffer where the \r
- *                      received data will be copied.\r
- * @param buff_size     The buff_size parameter is the size of the receive buffer \r
- *                      in bytes.\r
- * @return              This function returns the number of bytes copied into the \r
- *                      receive buffer.\r
- *\r
- * Example:\r
- * @code\r
- *   #define MAX_RX_DATA_SIZE    256\r
- *   \r
- *   uint8_t rx_data[MAX_RX_DATA_SIZE];\r
- *   uint8_t rx_size = 0;\r
- *           \r
- *   rx_size = UART_get_rx( &g_uart, rx_data, sizeof(rx_data) );\r
- * @endcode\r
- */\r
-size_t\r
-UART_get_rx\r
-(\r
-    UART_instance_t * this_uart,\r
-    uint8_t * rx_buffer,\r
-    size_t buff_size\r
-);\r
-\r
-/***************************************************************************//**\r
- * The function UART_polled_tx_string() is used to transmit a NULL ('\0') \r
- * terminated string. Internally, it polls for the transmit ready status and\r
- * transfers the text starting at the address pointed to by p_sz_string into\r
- * the UART's hardware transmitter FIFO. It is a blocking function and returns\r
- * only when the complete string has been transferred to the UART's transmit \r
- * FIFO.\r
- *\r
- * Note:    You cannot assume that the data you transmit using this function \r
- *          has been received at the other end by the time this function \r
- *          returns. The actual transmission over the serial connection will\r
- *          still be taking place at the time of the function return.\r
- *\r
- * @param this_uart     The this_uart parameter is a pointer to a \r
- *                      UART_instance_t structure which holds\r
- *                      all data regarding this instance of the UART.\r
- * @param p_sz_string   The p_sz_string parameter is a pointer to a buffer\r
- *                      containing the NULL ('\0') terminated string to be \r
- *                      transmitted.\r
- * @return              This function does not return a value.\r
- *\r
- * Example:\r
- * @code\r
- *   uint8_t testmsg1[] = {"\r\n\r\nUART_polled_tx_string() test message 1\0"};\r
- *   UART_polled_tx_string(&g_uart,(const uint8_t *)&testmsg1);\r
- * @endcode\r
- */\r
-void \r
-UART_polled_tx_string\r
-( \r
-    UART_instance_t * this_uart, \r
-    const uint8_t * p_sz_string\r
-);\r
-\r
-/***************************************************************************//**\r
- * The UART_get_rx_status() function returns the receiver error status of the \r
- * CoreUARTapb instance. It reads both the current error status of the receiver\r
- * and the accumulated error status from preceding calls to the UART_get_rx() \r
- * function and combines them using a bitwise OR. It returns the cumulative \r
- * parity, framing and overflow error status of the receiver, since the \r
- * previous call to UART_get_rx_status(), as an 8-bit encoded value.\r
- *\r
- * Note:    The UART_get_rx() function reads and accumulates the receiver status \r
- *          of the CoreUARTapb instance before reading each byte from the \r
- *          receiver's data register/FIFO. The driver maintains a sticky record \r
- *          of the cumulative error status, which persists after the \r
- *          UART_get_rx() function returns. The UART_get_rx_status() function \r
- *          clears this accumulated record of receiver errors before returning.\r
- * \r
- * @param this_uart     The this_uart parameter is a pointer to a UART_instance_t\r
- *                      structure which holds all data regarding this instance \r
- *                      of the UART.\r
- * @return              This function returns the UART receiver error status as \r
- *                      an 8-bit encoded value. The returned value is 0 if no \r
- *                      receiver errors occurred. The driver provides a set of \r
- *                      bit mask constants which should be compared with and/or\r
- *                      used to mask the returned value to determine the \r
- *                      receiver error status. \r
- *                      When the return value is compared to the following bit \r
- *                      masks, a non-zero result indicates that the \r
- *                      corresponding error occurred:\r
- *                      UART_APB_PARITY_ERROR    (bit mask = 0x01)\r
- *                      UART_APB_OVERFLOW_ERROR  (bit mask = 0x02)\r
- *                      UART_APB_FRAMING_ERROR   (bit mask = 0x04)\r
- *                      When the return value is compared to the following bit \r
- *                      mask, a non-zero result indicates that no error occurred:\r
- *                      UART_APB_NO_ERROR        (0x00)\r
- *\r
- * Example:\r
- * @code\r
- *   UART_instance_t g_uart;\r
- *   uint8_t rx_data[MAX_RX_DATA_SIZE];\r
- *   uint8_t err_status;\r
- *   err_status = UART_get_err_status(&g_uart);\r
- *   \r
- *   if(UART_APB_NO_ERROR == err_status )\r
- *   {\r
- *        rx_size = UART_get_rx( &g_uart, rx_data, MAX_RX_DATA_SIZE );\r
- *   }\r
- * @endcode\r
- */\r
-uint8_t\r
-UART_get_rx_status\r
-(\r
-    UART_instance_t * this_uart\r
-);\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif /* __CORE_UART_APB_H */\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/coreuartapb_regs.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/coreuartapb_regs.h
deleted file mode 100644 (file)
index e6cc8c1..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2007-2017 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * SVN $Revision: 9082 $\r
- * SVN $Date: 2017-04-28 11:51:36 +0530 (Fri, 28 Apr 2017) $\r
- */\r
-\r
-#ifndef __CORE_UART_APB_REGISTERS\r
-#define __CORE_UART_APB_REGISTERS   1\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-/*------------------------------------------------------------------------------\r
- * TxData register details\r
- */\r
-#define TXDATA_REG_OFFSET   0x0u\r
-\r
-/*\r
- * TxData bits.\r
- */\r
-#define TXDATA_OFFSET   0x0u\r
-#define TXDATA_MASK     0xFFu\r
-#define TXDATA_SHIFT    0u\r
-\r
-/*------------------------------------------------------------------------------\r
- * RxData register details\r
- */\r
-#define RXDATA_REG_OFFSET   0x4u\r
-\r
-/*\r
- * RxData bits.\r
- */\r
-#define RXDATA_OFFSET   0x4u\r
-#define RXDATA_MASK     0xFFu\r
-#define RXDATA_SHIFT    0u\r
-\r
-/*------------------------------------------------------------------------------\r
- * ControReg1 register details\r
- */\r
-#define CTRL1_REG_OFFSET        0x8u\r
-\r
-/*\r
- * Baud value (Lower 8-bits)\r
- */\r
-#define CTRL1_BAUDVALUE_OFFSET   0x8u\r
-#define CTRL1_BAUDVALUE_MASK     0xFFu\r
-#define CTRL1_BAUDVALUE_SHIFT    0u\r
-\r
-/*------------------------------------------------------------------------------\r
- * ControReg2 register details\r
- */\r
-#define CTRL2_REG_OFFSET          0xCu\r
-\r
-/*\r
- * Bit length\r
- */\r
-#define CTRL2_BIT_LENGTH_OFFSET   0xCu\r
-#define CTRL2_BIT_LENGTH_MASK     0x01u\r
-#define CTRL2_BIT_LENGTH_SHIFT    0u\r
-\r
-/*\r
- * Parity enable.\r
- */\r
-#define CTRL2_PARITY_EN_OFFSET    0xCu\r
-#define CTRL2_PARITY_EN_MASK      0x02u\r
-#define CTRL2_PARITY_EN_SHIFT     1u\r
-\r
-/*\r
- * Odd/even parity selection.\r
- */\r
-#define CTRL2_ODD_EVEN_OFFSET     0xCu\r
-#define CTRL2_ODD_EVEN_MASK       0x04u\r
-#define CTRL2_ODD_EVEN_SHIFT      2u\r
-\r
-/*\r
- *  Baud value (Higher 5-bits)\r
- */\r
-#define CTRL2_BAUDVALUE_OFFSET    0xCu\r
-#define CTRL2_BAUDVALUE_MASK      0xF8u\r
-#define CTRL2_BAUDVALUE_SHIFT     3u\r
-\r
-/*------------------------------------------------------------------------------\r
- * StatusReg register details\r
- */\r
-#define StatusReg_REG_OFFSET    0x10u\r
-\r
-#define STATUS_REG_OFFSET       0x10u\r
-\r
-/*\r
- * Transmit ready.\r
- */\r
-#define STATUS_TXRDY_OFFSET   0x10u\r
-#define STATUS_TXRDY_MASK     0x01u\r
-#define STATUS_TXRDY_SHIFT    0u\r
-\r
-/*\r
- * Receive full.\r
- */\r
-#define STATUS_RXFULL_OFFSET   0x10u\r
-#define STATUS_RXFULL_MASK     0x02u\r
-#define STATUS_RXFULL_SHIFT    1u\r
-\r
-/*\r
- * Parity error.\r
- */\r
-#define STATUS_PARITYERR_OFFSET   0x10u\r
-#define STATUS_PARITYERR_MASK     0x04u\r
-#define STATUS_PARITYERR_SHIFT    2u\r
-\r
-/*\r
- * Overflow.\r
- */\r
-#define STATUS_OVERFLOW_OFFSET   0x10u\r
-#define STATUS_OVERFLOW_MASK     0x08u\r
-#define STATUS_OVERFLOW_SHIFT    3u\r
-\r
-/*\r
- * Frame Error.\r
- */\r
-#define STATUS_FRAMERR_OFFSET   0x10u\r
-#define STATUS_FRAMERR_MASK     0x10u\r
-#define STATUS_FRAMERR_SHIFT    4u\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif /* __CORE_UART_APB_REGISTERS */\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/cpu_types.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/cpu_types.h
deleted file mode 100644 (file)
index 1beae8c..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * SVN $Revision: 9661 $\r
- * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
- */\r
-#ifndef __CPU_TYPES_H\r
-#define __CPU_TYPES_H   1\r
-\r
-#include <stdint.h>\r
-\r
-/*------------------------------------------------------------------------------\r
- */\r
-typedef unsigned int size_t;\r
-\r
-/*------------------------------------------------------------------------------\r
- * addr_t: address type.\r
- * Used to specify the address of peripherals present in the processor's memory\r
- * map.\r
- */\r
-typedef unsigned int addr_t;\r
-\r
-/*------------------------------------------------------------------------------\r
- * psr_t: processor state register.\r
- * Used by HAL_disable_interrupts() and HAL_restore_interrupts() to store the\r
- * processor's state between disabling and restoring interrupts.\r
- */\r
-typedef unsigned int psr_t;\r
-\r
-#endif  /* __CPU_TYPES_H */\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hal.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hal.h
deleted file mode 100644 (file)
index 5b82ed0..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-/***************************************************************************//**\r
- * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * Hardware abstraction layer functions.\r
- * \r
- * SVN $Revision: 9661 $\r
- * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
- */\r
-#ifndef HAL_H_\r
-#define HAL_H_\r
-\r
-#include "cpu_types.h"\r
-#include "hw_reg_access.h"\r
-\r
-/***************************************************************************//**\r
- * Enable all interrupts at the processor level.\r
- */\r
-void HAL_enable_interrupts( void );\r
-\r
-/***************************************************************************//**\r
- * Disable all interrupts at the processor core level.\r
- * Return the interrupts enable state before disabling occured so that it can \r
- * later be restored. \r
- */\r
-psr_t HAL_disable_interrupts( void );\r
-\r
-/***************************************************************************//**\r
- * Restore the interrupts enable state at the processor core level.\r
- * This function is normally passed the value returned from a previous call to\r
- * HAL_disable_interrupts(). \r
- */\r
-void HAL_restore_interrupts( psr_t saved_psr );\r
-\r
-/***************************************************************************//**\r
- */\r
-#define FIELD_OFFSET(FIELD_NAME)  (FIELD_NAME##_OFFSET)\r
-#define FIELD_SHIFT(FIELD_NAME)   (FIELD_NAME##_SHIFT)\r
-#define FIELD_MASK(FIELD_NAME)    (FIELD_NAME##_MASK)\r
-\r
-/***************************************************************************//**\r
- * The macro HAL_set_32bit_reg() allows writing a 32 bits wide register.\r
- *\r
- * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
- *              peripheral containing the register.\r
- * REG_NAME:    A string identifying the register to write. These strings are\r
- *              specified in a header file associated with the peripheral.\r
- * VALUE:       A variable of type uint32_t containing the value to write.\r
- */\r
-#define HAL_set_32bit_reg(BASE_ADDR, REG_NAME, VALUE) \\r
-          (HW_set_32bit_reg( ((BASE_ADDR) + (REG_NAME##_REG_OFFSET)), (VALUE) ))\r
-\r
-/***************************************************************************//**\r
- * The macro HAL_get_32bit_reg() is used to read the value  of a 32 bits wide\r
- * register.\r
- * \r
- * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
- *              peripheral containing the register.\r
- * REG_NAME:    A string identifying the register to read. These strings are\r
- *              specified in a header file associated with the peripheral.\r
- * RETURN:      This function-like macro returns a uint32_t value.\r
- */\r
-#define HAL_get_32bit_reg(BASE_ADDR, REG_NAME) \\r
-          (HW_get_32bit_reg( ((BASE_ADDR) + (REG_NAME##_REG_OFFSET)) ))\r
-\r
-/***************************************************************************//**\r
- * The macro HAL_set_32bit_reg_field() is used to write a field within a\r
- * 32 bits wide register. The field written can be one or more bits.\r
- * \r
- * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
- *              peripheral containing the register.\r
- * FIELD_NAME:  A string identifying the register field to write. These strings\r
- *              are specified in a header file associated with the peripheral.\r
- * VALUE:       A variable of type uint32_t containing the field value to write.\r
- */\r
-#define HAL_set_32bit_reg_field(BASE_ADDR, FIELD_NAME, VALUE) \\r
-            (HW_set_32bit_reg_field(\\r
-                (BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\\r
-                FIELD_SHIFT(FIELD_NAME),\\r
-                FIELD_MASK(FIELD_NAME),\\r
-                (VALUE)))\r
-  \r
-/***************************************************************************//**\r
- * The macro HAL_get_32bit_reg_field() is used to read a register field from\r
- * within a 32 bit wide peripheral register. The field can be one or more bits.\r
- * \r
- * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
- *              peripheral containing the register.\r
- * FIELD_NAME:  A string identifying the register field to write. These strings\r
- *              are specified in a header file associated with the peripheral.\r
- * RETURN:      This function-like macro returns a uint32_t value.\r
- */\r
-#define HAL_get_32bit_reg_field(BASE_ADDR, FIELD_NAME) \\r
-            (HW_get_32bit_reg_field(\\r
-                (BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\\r
-                FIELD_SHIFT(FIELD_NAME),\\r
-                FIELD_MASK(FIELD_NAME)))\r
-  \r
-/***************************************************************************//**\r
- * The macro HAL_set_16bit_reg() allows writing a 16 bits wide register.\r
- *\r
- * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
- *              peripheral containing the register.\r
- * REG_NAME:    A string identifying the register to write. These strings are\r
- *              specified in a header file associated with the peripheral.\r
- * VALUE:       A variable of type uint_fast16_t containing the value to write.\r
- */\r
-#define HAL_set_16bit_reg(BASE_ADDR, REG_NAME, VALUE) \\r
-            (HW_set_16bit_reg( ((BASE_ADDR) + (REG_NAME##_REG_OFFSET)), (VALUE) ))\r
-\r
-/***************************************************************************//**\r
- * The macro HAL_get_16bit_reg() is used to read the value  of a 16 bits wide\r
- * register.\r
- * \r
- * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
- *              peripheral containing the register.\r
- * REG_NAME:    A string identifying the register to read. These strings are\r
- *              specified in a header file associated with the peripheral.\r
- * RETURN:      This function-like macro returns a uint16_t value.\r
- */\r
-#define HAL_get_16bit_reg(BASE_ADDR, REG_NAME) \\r
-            (HW_get_16bit_reg( (BASE_ADDR) + (REG_NAME##_REG_OFFSET) ))\r
-\r
-/***************************************************************************//**\r
- * The macro HAL_set_16bit_reg_field() is used to write a field within a\r
- * 16 bits wide register. The field written can be one or more bits.\r
- * \r
- * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
- *              peripheral containing the register.\r
- * FIELD_NAME:  A string identifying the register field to write. These strings\r
- *              are specified in a header file associated with the peripheral.\r
- * VALUE:       A variable of type uint16_t containing the field value to write.\r
- */\r
-#define HAL_set_16bit_reg_field(BASE_ADDR, FIELD_NAME, VALUE) \\r
-            (HW_set_16bit_reg_field(\\r
-                (BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\\r
-                FIELD_SHIFT(FIELD_NAME),\\r
-                FIELD_MASK(FIELD_NAME),\\r
-                (VALUE)))  \r
-\r
-/***************************************************************************//**\r
- * The macro HAL_get_16bit_reg_field() is used to read a register field from\r
- * within a 8 bit wide peripheral register. The field can be one or more bits.\r
- * \r
- * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
- *              peripheral containing the register.\r
- * FIELD_NAME:  A string identifying the register field to write. These strings\r
- *              are specified in a header file associated with the peripheral.\r
- * RETURN:      This function-like macro returns a uint16_t value.\r
- */\r
-#define HAL_get_16bit_reg_field(BASE_ADDR, FIELD_NAME) \\r
-            (HW_get_16bit_reg_field(\\r
-                (BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\\r
-                FIELD_SHIFT(FIELD_NAME),\\r
-                FIELD_MASK(FIELD_NAME)))\r
-\r
-/***************************************************************************//**\r
- * The macro HAL_set_8bit_reg() allows writing a 8 bits wide register.\r
- *\r
- * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
- *              peripheral containing the register.\r
- * REG_NAME:    A string identifying the register to write. These strings are\r
- *              specified in a header file associated with the peripheral.\r
- * VALUE:       A variable of type uint_fast8_t containing the value to write.\r
- */\r
-#define HAL_set_8bit_reg(BASE_ADDR, REG_NAME, VALUE) \\r
-          (HW_set_8bit_reg( ((BASE_ADDR) + (REG_NAME##_REG_OFFSET)), (VALUE) ))\r
-\r
-/***************************************************************************//**\r
- * The macro HAL_get_8bit_reg() is used to read the value of a 8 bits wide\r
- * register.\r
- * \r
- * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
- *              peripheral containing the register.\r
- * REG_NAME:    A string identifying the register to read. These strings are\r
- *              specified in a header file associated with the peripheral.\r
- * RETURN:      This function-like macro returns a uint8_t value.\r
- */\r
-#define HAL_get_8bit_reg(BASE_ADDR, REG_NAME) \\r
-          (HW_get_8bit_reg( (BASE_ADDR) + (REG_NAME##_REG_OFFSET) ))\r
-\r
-/***************************************************************************//**\r
- */\r
-#define HAL_set_8bit_reg_field(BASE_ADDR, FIELD_NAME, VALUE) \\r
-            (HW_set_8bit_reg_field(\\r
-                (BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\\r
-                FIELD_SHIFT(FIELD_NAME),\\r
-                FIELD_MASK(FIELD_NAME),\\r
-                (VALUE)))\r
-\r
-/***************************************************************************//**\r
- * The macro HAL_get_8bit_reg_field() is used to read a register field from\r
- * within a 8 bit wide peripheral register. The field can be one or more bits.\r
- * \r
- * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
- *              peripheral containing the register.\r
- * FIELD_NAME:  A string identifying the register field to write. These strings\r
- *              are specified in a header file associated with the peripheral.\r
- * RETURN:      This function-like macro returns a uint8_t value.\r
- */\r
-#define HAL_get_8bit_reg_field(BASE_ADDR, FIELD_NAME) \\r
-            (HW_get_8bit_reg_field(\\r
-                (BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\\r
-                FIELD_SHIFT(FIELD_NAME),\\r
-                FIELD_MASK(FIELD_NAME)))\r
-  \r
-#endif /*HAL_H_*/\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hal_assert.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hal_assert.h
deleted file mode 100644 (file)
index db8ab77..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2008-2018 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * SVN $Revision: 9661 $\r
- * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
- */\r
-#ifndef HAL_ASSERT_HEADER\r
-#define HAL_ASSERT_HEADER\r
-\r
-#define NDEBUG 1\r
-\r
-#if defined(NDEBUG)\r
-/***************************************************************************//**\r
- * HAL_ASSERT() is defined out when the NDEBUG symbol is used.\r
- ******************************************************************************/\r
-#define HAL_ASSERT(CHECK)\r
-\r
-#else\r
-/***************************************************************************//**\r
- * Default behaviour for HAL_ASSERT() macro:\r
- *------------------------------------------------------------------------------\r
-  The behaviour is toolchain specific and project setting specific.\r
- ******************************************************************************/\r
-#define HAL_ASSERT(CHECK)     ASSERT(CHECK);\r
-\r
-#endif  /* NDEBUG */\r
-\r
-#endif  /* HAL_ASSERT_HEADER */\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hal_irq.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hal_irq.c
deleted file mode 100644 (file)
index 52f6301..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/***************************************************************************//**\r
- * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * Legacy interrupt control functions for the Microsemi driver library hardware\r
- * abstraction layer.\r
- *\r
- * SVN $Revision: 9661 $\r
- * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
- */\r
-#include "hal.h"\r
-#include "riscv_hal.h"\r
-\r
-/*------------------------------------------------------------------------------\r
- * \r
- */\r
-void HAL_enable_interrupts(void) {\r
-    __enable_irq();\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * \r
- */\r
-psr_t HAL_disable_interrupts(void) {\r
-    psr_t psr;\r
-    psr = read_csr(mstatus);\r
-    __disable_irq();\r
-    return(psr);\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * \r
- */\r
-void HAL_restore_interrupts(psr_t saved_psr) {\r
-    write_csr(mstatus, saved_psr);\r
-}\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hw_macros.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hw_macros.h
deleted file mode 100644 (file)
index 2149544..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- *  Hardware registers access macros.\r
- * \r
- *  THE MACROS DEFINED IN THIS FILE ARE DEPRECATED. DO NOT USED FOR NEW \r
- *  DEVELOPMENT.\r
- *\r
- * These macros are used to access peripheral's registers. They allow access to\r
- * 8, 16 and 32 bit wide registers. All accesses to peripheral registers should\r
- * be done through these macros in order to ease porting across different \r
- * processors/bus architectures.\r
- * \r
- * Some of these macros also allow to access a specific register field.\r
- * \r
- * SVN $Revision: 9661 $\r
- * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
- */\r
-#ifndef __HW_REGISTER_MACROS_H\r
-#define __HW_REGISTER_MACROS_H 1\r
-\r
-/*------------------------------------------------------------------------------\r
- * 32 bits registers access:\r
- */\r
-#define HW_get_uint32_reg(BASE_ADDR, REG_OFFSET) (*((uint32_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)))\r
-\r
-#define HW_set_uint32_reg(BASE_ADDR, REG_OFFSET, VALUE) (*((uint32_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)) = (VALUE))\r
-\r
-#define HW_set_uint32_reg_field(BASE_ADDR, FIELD, VALUE) \\r
-            (*((uint32_t volatile *)(BASE_ADDR + FIELD##_OFFSET)) =  \\r
-                ( \\r
-                    (uint32_t) \\r
-                    ( \\r
-                    (*((uint32_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & ~FIELD##_MASK) | \\r
-                    (uint32_t)(((VALUE) << FIELD##_SHIFT) & FIELD##_MASK) \\r
-                ) \\r
-            )\r
-\r
-#define HW_get_uint32_reg_field( BASE_ADDR, FIELD ) \\r
-            (( (*((uint32_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & FIELD##_MASK) >> FIELD##_SHIFT)\r
-\r
-/*------------------------------------------------------------------------------\r
- * 32 bits memory access:\r
- */\r
-#define HW_get_uint32(BASE_ADDR) (*((uint32_t volatile *)(BASE_ADDR)))\r
-\r
-#define HW_set_uint32(BASE_ADDR, VALUE) (*((uint32_t volatile *)(BASE_ADDR)) = (VALUE))\r
-\r
-/*------------------------------------------------------------------------------\r
- * 16 bits registers access:\r
- */\r
-#define HW_get_uint16_reg(BASE_ADDR, REG_OFFSET) (*((uint16_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)))\r
-\r
-#define HW_set_uint16_reg(BASE_ADDR, REG_OFFSET, VALUE) (*((uint16_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)) = (VALUE))\r
-\r
-#define HW_set_uint16_reg_field(BASE_ADDR, FIELD, VALUE) \\r
-            (*((uint16_t volatile *)(BASE_ADDR + FIELD##_OFFSET)) =  \\r
-                ( \\r
-                    (uint16_t) \\r
-                    ( \\r
-                    (*((uint16_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & ~FIELD##_MASK) | \\r
-                    (uint16_t)(((VALUE) << FIELD##_SHIFT) & FIELD##_MASK) \\r
-                ) \\r
-            )\r
-\r
-#define HW_get_uint16_reg_field( BASE_ADDR, FIELD ) \\r
-            (( (*((uint16_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & FIELD##_MASK) >> FIELD##_SHIFT)\r
-\r
-/*------------------------------------------------------------------------------\r
- * 8 bits registers access:\r
- */\r
-#define HW_get_uint8_reg(BASE_ADDR, REG_OFFSET) (*((uint8_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)))\r
-\r
-#define HW_set_uint8_reg(BASE_ADDR, REG_OFFSET, VALUE) (*((uint8_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)) = (VALUE))\r
\r
-#define HW_set_uint8_reg_field(BASE_ADDR, FIELD, VALUE) \\r
-            (*((uint8_t volatile *)(BASE_ADDR + FIELD##_OFFSET)) =  \\r
-                ( \\r
-                    (uint8_t) \\r
-                    ( \\r
-                    (*((uint8_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & ~FIELD##_MASK) | \\r
-                    (uint8_t)(((VALUE) << FIELD##_SHIFT) & FIELD##_MASK) \\r
-                ) \\r
-            )\r
-\r
-#define HW_get_uint8_reg_field( BASE_ADDR, FIELD ) \\r
-            (( (*((uint8_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & FIELD##_MASK) >> FIELD##_SHIFT)\r
-\r
-/*------------------------------------------------------------------------------\r
- * 8 bits memory access:\r
- */\r
-#define HW_get_uint8(BASE_ADDR) (*((uint8_t volatile *)(BASE_ADDR)))\r
-\r
-#define HW_set_uint8(BASE_ADDR, VALUE) (*((uint8_t volatile *)(BASE_ADDR)) = (VALUE))\r
\r
-#endif  /* __HW_REGISTER_MACROS_H */\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hw_reg_access.S b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hw_reg_access.S
deleted file mode 100644 (file)
index 68d93dd..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************//**\r
- * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
- *\r
- * Hardware registers access functions.\r
- * The implementation of these function is platform and toolchain specific.\r
- * The functions declared here are implemented using assembler as part of the\r
- * processor/toolchain specific HAL.\r
- *\r
- * SVN $Revision: 9661 $\r
- * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
- */\r
-\r
-.section .text\r
-    .globl HW_set_32bit_reg\r
-    .globl HW_get_32bit_reg\r
-    .globl HW_set_32bit_reg_field\r
-    .globl HW_get_32bit_reg_field\r
-    .globl HW_set_16bit_reg\r
-    .globl HW_get_16bit_reg\r
-    .globl HW_set_16bit_reg_field\r
-    .globl HW_get_16bit_reg_field\r
-    .globl HW_set_8bit_reg\r
-    .globl HW_get_8bit_reg\r
-    .globl HW_set_8bit_reg_field\r
-    .globl HW_get_8bit_reg_field\r
-\r
-\r
-/***************************************************************************//**\r
- * HW_set_32bit_reg is used to write the content of a 32 bits wide peripheral\r
- * register.\r
- *\r
- * a0:   addr_t reg_addr\r
- * a1:   uint32_t value\r
- */\r
-HW_set_32bit_reg:\r
-    sw a1, 0(a0)\r
-    ret\r
-\r
-/***************************************************************************//**\r
- * HW_get_32bit_reg is used to read the content of a 32 bits wide peripheral\r
- * register.\r
- *\r
- * R0:   addr_t reg_addr\r
- * @return          32 bits value read from the peripheral register.\r
- */\r
-HW_get_32bit_reg:\r
-    lw a0, 0(a0)\r
-    ret\r
-\r
-/***************************************************************************//**\r
- * HW_set_32bit_reg_field is used to set the content of a field in a 32 bits\r
- * wide peripheral register.\r
- *\r
- * a0:   addr_t reg_addr\r
- * a1:   int_fast8_t shift\r
- * a2:   uint32_t mask\r
- * a3:   uint32_t value\r
- */\r
-HW_set_32bit_reg_field:\r
-    mv t3, a3\r
-    sll t3, t3, a1\r
-    and  t3, t3, a2\r
-    lw t1, 0(a0)\r
-    mv t2, a2\r
-    not t2, t2\r
-    and t1, t1, t2\r
-    or t1, t1, t3\r
-    sw t1, 0(a0)\r
-    ret\r
-\r
-/***************************************************************************//**\r
- * HW_get_32bit_reg_field is used to read the content of a field out of a\r
- * 32 bits wide peripheral register.\r
- *\r
- * a0:   addr_t reg_addr\r
- * a1:   int_fast8_t shift\r
- * a2:   uint32_t mask\r
- *\r
- * @return          32 bits value containing the register field value specified\r
- *                  as parameter.\r
- */\r
-HW_get_32bit_reg_field:\r
-    lw a0, 0(a0)\r
-    and a0, a0, a2\r
-    srl a0, a0, a1\r
-    ret\r
-\r
-/***************************************************************************//**\r
- * HW_set_16bit_reg is used to write the content of a 16 bits wide peripheral\r
- * register.\r
- *\r
- * a0:   addr_t reg_addr\r
- * a1:   uint_fast16_t value\r
- */\r
-HW_set_16bit_reg:\r
-    sh a1, 0(a0)\r
-    ret\r
-\r
-/***************************************************************************//**\r
- * HW_get_16bit_reg is used to read the content of a 16 bits wide peripheral\r
- * register.\r
- *\r
- * a0:   addr_t reg_addr\r
- * @return          16 bits value read from the peripheral register.\r
- */\r
-HW_get_16bit_reg:\r
-    lh a0, (a0)\r
-    ret\r
-\r
-/***************************************************************************//**\r
- * HW_set_16bit_reg_field is used to set the content of a field in a 16 bits\r
- * wide peripheral register.\r
- *\r
- * a0:   addr_t reg_addr\r
- * a1:   int_fast8_t shift\r
- * a2:   uint_fast16_t mask\r
- * a3:   uint_fast16_t value\r
- * @param value     Value to be written in the specified field.\r
- */\r
-HW_set_16bit_reg_field:\r
-    mv t3, a3\r
-    sll t3, t3, a1\r
-    and  t3, t3, a2\r
-    lh t1, 0(a0)\r
-    mv t2, a2\r
-    not t2, t2\r
-    and t1, t1, t2\r
-    or t1, t1, t3\r
-    sh t1, 0(a0)\r
-    ret\r
-\r
-/***************************************************************************//**\r
- * HW_get_16bit_reg_field is used to read the content of a field from a\r
- * 16 bits wide peripheral register.\r
- *\r
- * a0:   addr_t reg_addr\r
- * a1:   int_fast8_t shift\r
- * a2:   uint_fast16_t mask\r
- *\r
- * @return          16 bits value containing the register field value specified\r
- *                  as parameter.\r
- */\r
-HW_get_16bit_reg_field:\r
-    lh a0, 0(a0)\r
-    and a0, a0, a2\r
-    srl a0, a0, a1\r
-    ret\r
-\r
-/***************************************************************************//**\r
- * HW_set_8bit_reg is used to write the content of a 8 bits wide peripheral\r
- * register.\r
- *\r
- * a0:   addr_t reg_addr\r
- * a1:   uint_fast8_t value\r
- */\r
-HW_set_8bit_reg:\r
-    sb a1, 0(a0)\r
-    ret\r
-\r
-/***************************************************************************//**\r
- * HW_get_8bit_reg is used to read the content of a 8 bits wide peripheral\r
- * register.\r
- *\r
- * a0:   addr_t reg_addr\r
- * @return          8 bits value read from the peripheral register.\r
- */\r
-HW_get_8bit_reg:\r
-    lb a0, 0(a0)\r
-    ret\r
-\r
-/***************************************************************************//**\r
- * HW_set_8bit_reg_field is used to set the content of a field in a 8 bits\r
- * wide peripheral register.\r
- *\r
- * a0:   addr_t reg_addr,\r
- * a1:   int_fast8_t shift\r
- * a2:   uint_fast8_t mask\r
- * a3:   uint_fast8_t value\r
- */\r
-HW_set_8bit_reg_field:\r
-    mv t3, a3\r
-    sll t3, t3, a1\r
-    and  t3, t3, a2\r
-    lb t1, 0(a0)\r
-    mv t2, a2\r
-    not t2, t2\r
-    and t1, t1, t2\r
-    or t1, t1, t3\r
-    sb t1, 0(a0)\r
-    ret\r
-\r
-/***************************************************************************//**\r
- * HW_get_8bit_reg_field is used to read the content of a field from a\r
- * 8 bits wide peripheral register.\r
- *\r
- * a0:   addr_t reg_addr\r
- * a1:   int_fast8_t shift\r
- * a2:   uint_fast8_t mask\r
- *\r
- * @return          8 bits value containing the register field value specified\r
- *                  as parameter.\r
- */\r
-HW_get_8bit_reg_field:\r
-    lb a0, 0(a0)\r
-    and a0, a0, a2\r
-    srl a0, a0, a1\r
-    ret\r
-\r
-.end\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hw_reg_access.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hw_reg_access.h
deleted file mode 100644 (file)
index bc3dd65..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-/***************************************************************************//**\r
- * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
- * \r
- * Hardware registers access functions.\r
- * The implementation of these function is platform and toolchain specific.\r
- * The functions declared here are implemented using assembler as part of the \r
- * processor/toolchain specific HAL.\r
- * \r
- * SVN $Revision: 9661 $\r
- * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
- */\r
-#ifndef HW_REG_ACCESS\r
-#define HW_REG_ACCESS\r
-\r
-#include "cpu_types.h"\r
-/***************************************************************************//**\r
- * HW_set_32bit_reg is used to write the content of a 32 bits wide peripheral\r
- * register.\r
- * \r
- * @param reg_addr  Address in the processor's memory map of the register to\r
- *                  write.\r
- * @param value     Value to be written into the peripheral register.\r
- */\r
-void\r
-HW_set_32bit_reg\r
-(\r
-    addr_t reg_addr,\r
-    uint32_t value\r
-);\r
-\r
-/***************************************************************************//**\r
- * HW_get_32bit_reg is used to read the content of a 32 bits wide peripheral\r
- * register.\r
- * \r
- * @param reg_addr  Address in the processor's memory map of the register to\r
- *                  read.\r
- * @return          32 bits value read from the peripheral register.\r
- */\r
-uint32_t\r
-HW_get_32bit_reg\r
-(\r
-    addr_t reg_addr\r
-);\r
-\r
-/***************************************************************************//**\r
- * HW_set_32bit_reg_field is used to set the content of a field in a 32 bits \r
- * wide peripheral register.\r
- * \r
- * @param reg_addr  Address in the processor's memory map of the register to\r
- *                  be written.\r
- * @param shift     Bit offset of the register field to be read within the \r
- *                  register.\r
- * @param mask      Bit mask to be applied to the raw register value to filter\r
- *                  out the other register fields values.\r
- * @param value     Value to be written in the specified field.\r
- */\r
-void\r
-HW_set_32bit_reg_field\r
-(\r
-    addr_t reg_addr,\r
-    int_fast8_t shift,\r
-    uint32_t mask,\r
-    uint32_t value\r
-);\r
-\r
-/***************************************************************************//**\r
- * HW_get_32bit_reg_field is used to read the content of a field out of a \r
- * 32 bits wide peripheral register.\r
- * \r
- * @param reg_addr  Address in the processor's memory map of the register to\r
- *                  read.\r
- * @param shift     Bit offset of the register field to be written within the \r
- *                  register.\r
- * @param mask      Bit mask to be applied to the raw register value to filter\r
- *                  out the other register fields values.\r
- *\r
- * @return          32 bits value containing the register field value specified\r
- *                  as parameter.\r
- */\r
-uint32_t \r
-HW_get_32bit_reg_field\r
-(\r
-    addr_t reg_addr,\r
-    int_fast8_t shift,\r
-    uint32_t mask\r
-);\r
-\r
-/***************************************************************************//**\r
- * HW_set_16bit_reg is used to write the content of a 16 bits wide peripheral\r
- * register.\r
- * \r
- * @param reg_addr  Address in the processor's memory map of the register to\r
- *                  write.\r
- * @param value     Value to be written into the peripheral register.\r
- */\r
-void\r
-HW_set_16bit_reg\r
-(\r
-    addr_t reg_addr,\r
-    uint_fast16_t value\r
-);\r
-\r
-/***************************************************************************//**\r
- * HW_get_16bit_reg is used to read the content of a 16 bits wide peripheral\r
- * register.\r
- * \r
- * @param reg_addr  Address in the processor's memory map of the register to\r
- *                  read.\r
- * @return          16 bits value read from the peripheral register.\r
- */\r
-uint16_t\r
-HW_get_16bit_reg\r
-(\r
-    addr_t reg_addr\r
-);\r
-\r
-/***************************************************************************//**\r
- * HW_set_16bit_reg_field is used to set the content of a field in a 16 bits \r
- * wide peripheral register.\r
- * \r
- * @param reg_addr  Address in the processor's memory map of the register to\r
- *                  be written.\r
- * @param shift     Bit offset of the register field to be read within the \r
- *                  register.\r
- * @param mask      Bit mask to be applied to the raw register value to filter\r
- *                  out the other register fields values.\r
- * @param value     Value to be written in the specified field.\r
- */\r
-void HW_set_16bit_reg_field\r
-(\r
-    addr_t reg_addr,\r
-    int_fast8_t shift,\r
-    uint_fast16_t mask,\r
-    uint_fast16_t value\r
-);\r
-\r
-/***************************************************************************//**\r
- * HW_get_16bit_reg_field is used to read the content of a field from a \r
- * 16 bits wide peripheral register.\r
- * \r
- * @param reg_addr  Address in the processor's memory map of the register to\r
- *                  read.\r
- * @param shift     Bit offset of the register field to be written within the \r
- *                  register.\r
- * @param mask      Bit mask to be applied to the raw register value to filter\r
- *                  out the other register fields values.\r
- *\r
- * @return          16 bits value containing the register field value specified\r
- *                  as parameter.\r
- */\r
-uint16_t HW_get_16bit_reg_field\r
-(\r
-    addr_t reg_addr,\r
-    int_fast8_t shift,\r
-    uint_fast16_t mask\r
-);\r
-\r
-/***************************************************************************//**\r
- * HW_set_8bit_reg is used to write the content of a 8 bits wide peripheral\r
- * register.\r
- * \r
- * @param reg_addr  Address in the processor's memory map of the register to\r
- *                  write.\r
- * @param value     Value to be written into the peripheral register.\r
- */\r
-void\r
-HW_set_8bit_reg\r
-(\r
-    addr_t reg_addr,\r
-    uint_fast8_t value\r
-);\r
-\r
-/***************************************************************************//**\r
- * HW_get_8bit_reg is used to read the content of a 8 bits wide peripheral\r
- * register.\r
- * \r
- * @param reg_addr  Address in the processor's memory map of the register to\r
- *                  read.\r
- * @return          8 bits value read from the peripheral register.\r
- */\r
-uint8_t\r
-HW_get_8bit_reg\r
-(\r
-    addr_t reg_addr\r
-);\r
-\r
-/***************************************************************************//**\r
- * HW_set_8bit_reg_field is used to set the content of a field in a 8 bits \r
- * wide peripheral register.\r
- * \r
- * @param reg_addr  Address in the processor's memory map of the register to\r
- *                  be written.\r
- * @param shift     Bit offset of the register field to be read within the \r
- *                  register.\r
- * @param mask      Bit mask to be applied to the raw register value to filter\r
- *                  out the other register fields values.\r
- * @param value     Value to be written in the specified field.\r
- */\r
-void HW_set_8bit_reg_field\r
-(\r
-    addr_t reg_addr,\r
-    int_fast8_t shift,\r
-    uint_fast8_t mask,\r
-    uint_fast8_t value\r
-);\r
-\r
-/***************************************************************************//**\r
- * HW_get_8bit_reg_field is used to read the content of a field from a \r
- * 8 bits wide peripheral register.\r
- * \r
- * @param reg_addr  Address in the processor's memory map of the register to\r
- *                  read.\r
- * @param shift     Bit offset of the register field to be written within the \r
- *                  register.\r
- * @param mask      Bit mask to be applied to the raw register value to filter\r
- *                  out the other register fields values.\r
- *\r
- * @return          8 bits value containing the register field value specified\r
- *                  as parameter.\r
- */\r
-uint8_t HW_get_8bit_reg_field\r
-(\r
-    addr_t reg_addr,\r
-    int_fast8_t shift,\r
-    uint_fast8_t mask\r
-);\r
-\r
-#endif /* HW_REG_ACCESS */\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/encoding.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/encoding.h
deleted file mode 100644 (file)
index aa379ee..0000000
+++ /dev/null
@@ -1,596 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
- *\r
- * @file encodings.h\r
- * @author Microsemi SoC Products Group\r
- * @brief Mi-V soft processor register bit mask and shift constants encodings.\r
- *\r
- * SVN $Revision: 9825 $\r
- * SVN $Date: 2018-03-19 10:31:41 +0530 (Mon, 19 Mar 2018) $\r
- */\r
-#ifndef RISCV_CSR_ENCODING_H\r
-#define RISCV_CSR_ENCODING_H\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-#define MSTATUS_UIE         0x00000001\r
-#define MSTATUS_SIE         0x00000002\r
-#define MSTATUS_HIE         0x00000004\r
-#define MSTATUS_MIE         0x00000008\r
-#define MSTATUS_UPIE        0x00000010\r
-#define MSTATUS_SPIE        0x00000020\r
-#define MSTATUS_HPIE        0x00000040\r
-#define MSTATUS_MPIE        0x00000080\r
-#define MSTATUS_SPP         0x00000100\r
-#define MSTATUS_HPP         0x00000600\r
-#define MSTATUS_MPP         0x00001800\r
-#define MSTATUS_FS          0x00006000\r
-#define MSTATUS_XS          0x00018000\r
-#define MSTATUS_MPRV        0x00020000\r
-#define MSTATUS_SUM         0x00040000      /*changed in v1.10*/\r
-#define MSTATUS_MXR         0x00080000      /*changed in v1.10*/\r
-#define MSTATUS_TVM         0x00100000      /*changed in v1.10*/\r
-#define MSTATUS_TW          0x00200000      /*changed in v1.10*/\r
-#define MSTATUS_TSR         0x00400000      /*changed in v1.10*/\r
-#define MSTATUS_RES         0x7F800000      /*changed in v1.10*/\r
-#define MSTATUS32_SD        0x80000000\r
-#define MSTATUS64_SD        0x8000000000000000\r
-\r
-#define MCAUSE32_CAUSE       0x7FFFFFFF\r
-#define MCAUSE64_CAUSE       0x7FFFFFFFFFFFFFFF\r
-#define MCAUSE32_INT         0x80000000\r
-#define MCAUSE64_INT         0x8000000000000000\r
-\r
-#define SSTATUS_UIE         0x00000001\r
-#define SSTATUS_SIE         0x00000002\r
-#define SSTATUS_UPIE        0x00000010\r
-#define SSTATUS_SPIE        0x00000020\r
-#define SSTATUS_SPP         0x00000100\r
-#define SSTATUS_FS          0x00006000\r
-#define SSTATUS_XS          0x00018000\r
-#define SSTATUS_PUM         0x00040000\r
-#define SSTATUS32_SD        0x80000000\r
-#define SSTATUS64_SD        0x8000000000000000\r
-\r
-#define MIP_SSIP            (1u << IRQ_S_SOFT)\r
-#define MIP_HSIP            (1u << IRQ_H_SOFT)\r
-#define MIP_MSIP            (1u << IRQ_M_SOFT)\r
-#define MIP_STIP            (1u << IRQ_S_TIMER)\r
-#define MIP_HTIP            (1u << IRQ_H_TIMER)\r
-#define MIP_MTIP            (1u << IRQ_M_TIMER)\r
-#define MIP_SEIP            (1u << IRQ_S_EXT)\r
-#define MIP_HEIP            (1u << IRQ_H_EXT)\r
-#define MIP_MEIP            (1u << IRQ_M_EXT)\r
-\r
-#define SIP_SSIP            MIP_SSIP\r
-#define SIP_STIP            MIP_STIP\r
-\r
-#define PRV_U               0\r
-#define PRV_S               1\r
-#define PRV_H               2\r
-#define PRV_M               3\r
-\r
-#define VM_MBARE            0\r
-#define VM_MBB              1\r
-#define VM_MBBID            2\r
-#define VM_SV32             8\r
-#define VM_SV39             9\r
-#define VM_SV48             10\r
-\r
-#define IRQ_S_SOFT          1\r
-#define IRQ_H_SOFT          2\r
-#define IRQ_M_SOFT          3\r
-#define IRQ_S_TIMER         5\r
-#define IRQ_H_TIMER         6\r
-#define IRQ_M_TIMER         7\r
-#define IRQ_S_EXT           9\r
-#define IRQ_H_EXT           10\r
-#define IRQ_M_EXT           11\r
-\r
-#define DEFAULT_RSTVEC      0x00001000\r
-#define DEFAULT_NMIVEC      0x00001004\r
-#define DEFAULT_MTVEC       0x00001010\r
-#define CONFIG_STRING_ADDR  0x0000100C\r
-#define EXT_IO_BASE         0x40000000\r
-#define DRAM_BASE           0x80000000\r
-\r
-/* page table entry (PTE) fields */\r
-#define PTE_V               0x001       /* Valid */\r
-#define PTE_TYPE            0x01E       /* Type  */\r
-#define PTE_R               0x020       /* Referenced */\r
-#define PTE_D               0x040       /* Dirty */\r
-#define PTE_SOFT            0x380       /* Reserved for Software */\r
-\r
-#define PTE_TYPE_TABLE        0x00\r
-#define PTE_TYPE_TABLE_GLOBAL 0x02\r
-#define PTE_TYPE_URX_SR       0x04\r
-#define PTE_TYPE_URWX_SRW     0x06\r
-#define PTE_TYPE_UR_SR        0x08\r
-#define PTE_TYPE_URW_SRW      0x0A\r
-#define PTE_TYPE_URX_SRX      0x0C\r
-#define PTE_TYPE_URWX_SRWX    0x0E\r
-#define PTE_TYPE_SR           0x10\r
-#define PTE_TYPE_SRW          0x12\r
-#define PTE_TYPE_SRX          0x14\r
-#define PTE_TYPE_SRWX         0x16\r
-#define PTE_TYPE_SR_GLOBAL    0x18\r
-#define PTE_TYPE_SRW_GLOBAL   0x1A\r
-#define PTE_TYPE_SRX_GLOBAL   0x1C\r
-#define PTE_TYPE_SRWX_GLOBAL  0x1E\r
-\r
-#define PTE_PPN_SHIFT 10\r
-\r
-#define PTE_TABLE(PTE) ((0x0000000AU >> ((PTE) & 0x1F)) & 1)\r
-#define PTE_UR(PTE)    ((0x0000AAA0U >> ((PTE) & 0x1F)) & 1)\r
-#define PTE_UW(PTE)    ((0x00008880U >> ((PTE) & 0x1F)) & 1)\r
-#define PTE_UX(PTE)    ((0x0000A0A0U >> ((PTE) & 0x1F)) & 1)\r
-#define PTE_SR(PTE)    ((0xAAAAAAA0U >> ((PTE) & 0x1F)) & 1)\r
-#define PTE_SW(PTE)    ((0x88888880U >> ((PTE) & 0x1F)) & 1)\r
-#define PTE_SX(PTE)    ((0xA0A0A000U >> ((PTE) & 0x1F)) & 1)\r
-\r
-#define PTE_CHECK_PERM(PTE, SUPERVISOR, STORE, FETCH) \\r
-  ((STORE) ? ((SUPERVISOR) ? PTE_SW(PTE) : PTE_UW(PTE)) : \\r
-   (FETCH) ? ((SUPERVISOR) ? PTE_SX(PTE) : PTE_UX(PTE)) : \\r
-             ((SUPERVISOR) ? PTE_SR(PTE) : PTE_UR(PTE)))\r
-\r
-#ifdef __riscv\r
-\r
-#if __riscv_xlen == 64\r
-# define MSTATUS_SD             MSTATUS64_SD\r
-# define SSTATUS_SD             SSTATUS64_SD\r
-# define MCAUSE_INT             MCAUSE64_INT\r
-# define MCAUSE_CAUSE           MCAUSE64_CAUSE\r
-# define RISCV_PGLEVEL_BITS     9\r
-#else\r
-# define MSTATUS_SD             MSTATUS32_SD\r
-# define SSTATUS_SD             SSTATUS32_SD\r
-# define RISCV_PGLEVEL_BITS     10\r
-# define MCAUSE_INT             MCAUSE32_INT\r
-# define MCAUSE_CAUSE           MCAUSE32_CAUSE\r
-#endif\r
-\r
-#define RISCV_PGSHIFT           12\r
-#define RISCV_PGSIZE            (1 << RISCV_PGSHIFT)\r
-\r
-#ifndef __ASSEMBLER__\r
-\r
-#ifdef __GNUC__\r
-\r
-#define read_csr(reg) ({ unsigned long __tmp; \\r
-  asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \\r
-  __tmp; })\r
-\r
-#define write_csr(reg, val) ({ \\r
-  if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \\r
-    asm volatile ("csrw " #reg ", %0" :: "i"(val)); \\r
-  else \\r
-    asm volatile ("csrw " #reg ", %0" :: "r"(val)); })\r
-\r
-#define swap_csr(reg, val) ({ unsigned long __tmp; \\r
-  if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \\r
-    asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "i"(val)); \\r
-  else \\r
-    asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "r"(val)); \\r
-  __tmp; })\r
-\r
-#define set_csr(reg, bit) ({ unsigned long __tmp; \\r
-  if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \\r
-    asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \\r
-  else \\r
-    asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \\r
-  __tmp; })\r
-\r
-#define clear_csr(reg, bit) ({ unsigned long __tmp; \\r
-  if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \\r
-    asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \\r
-  else \\r
-    asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \\r
-  __tmp; })\r
-\r
-#define rdtime() read_csr(time)\r
-#define rdcycle() read_csr(cycle)\r
-#define rdinstret() read_csr(instret)\r
-\r
-#ifdef __riscv_atomic\r
-\r
-#define MASK(nr)                    (1UL << nr)\r
-#define MASK_NOT(nr)                (~(1UL << nr))\r
-\r
-/**\r
- * atomic_read - read atomic variable\r
- * @v: pointer of type int\r
- *\r
- * Atomically reads the value of @v.\r
- */\r
-static inline int atomic_read(const int *v)\r
-{\r
-    return *((volatile int *)(v));\r
-}\r
-\r
-/**\r
- * atomic_set - set atomic variable\r
- * @v: pointer of type int\r
- * @i: required value\r
- *\r
- * Atomically sets the value of @v to @i.\r
- */\r
-static inline void atomic_set(int *v, int i)\r
-{\r
-    *v = i;\r
-}\r
-\r
-/**\r
- * atomic_add - add integer to atomic variable\r
- * @i: integer value to add\r
- * @v: pointer of type int\r
- *\r
- * Atomically adds @i to @v.\r
- */\r
-static inline void atomic_add(int i, int *v)\r
-{\r
-    __asm__ __volatile__ (\r
-        "amoadd.w zero, %1, %0"\r
-        : "+A" (*v)\r
-        : "r" (i));\r
-}\r
-\r
-static inline int atomic_fetch_add(unsigned int mask, int *v)\r
-{\r
-    int out;\r
-\r
-    __asm__ __volatile__ (\r
-        "amoadd.w %2, %1, %0"\r
-        : "+A" (*v), "=r" (out)\r
-        : "r" (mask));\r
-    return out;\r
-}\r
-\r
-/**\r
- * atomic_sub - subtract integer from atomic variable\r
- * @i: integer value to subtract\r
- * @v: pointer of type int\r
- *\r
- * Atomically subtracts @i from @v.\r
- */\r
-static inline void atomic_sub(int i, int *v)\r
-{\r
-    atomic_add(-i, v);\r
-}\r
-\r
-static inline int atomic_fetch_sub(unsigned int mask, int *v)\r
-{\r
-    int out;\r
-\r
-    __asm__ __volatile__ (\r
-        "amosub.w %2, %1, %0"\r
-        : "+A" (*v), "=r" (out)\r
-        : "r" (mask));\r
-    return out;\r
-}\r
-\r
-/**\r
- * atomic_add_return - add integer to atomic variable\r
- * @i: integer value to add\r
- * @v: pointer of type int\r
- *\r
- * Atomically adds @i to @v and returns the result\r
- */\r
-static inline int atomic_add_return(int i, int *v)\r
-{\r
-    register int c;\r
-    __asm__ __volatile__ (\r
-        "amoadd.w %0, %2, %1"\r
-        : "=r" (c), "+A" (*v)\r
-        : "r" (i));\r
-    return (c + i);\r
-}\r
-\r
-/**\r
- * atomic_sub_return - subtract integer from atomic variable\r
- * @i: integer value to subtract\r
- * @v: pointer of type int\r
- *\r
- * Atomically subtracts @i from @v and returns the result\r
- */\r
-static inline int atomic_sub_return(int i, int *v)\r
-{\r
-    return atomic_add_return(-i, v);\r
-}\r
-\r
-/**\r
- * atomic_inc - increment atomic variable\r
- * @v: pointer of type int\r
- *\r
- * Atomically increments @v by 1.\r
- */\r
-static inline void atomic_inc(int *v)\r
-{\r
-    atomic_add(1, v);\r
-}\r
-\r
-/**\r
- * atomic_dec - decrement atomic variable\r
- * @v: pointer of type int\r
- *\r
- * Atomically decrements @v by 1.\r
- */\r
-static inline void atomic_dec(int *v)\r
-{\r
-    atomic_add(-1, v);\r
-}\r
-\r
-static inline int atomic_inc_return(int *v)\r
-{\r
-    return atomic_add_return(1, v);\r
-}\r
-\r
-static inline int atomic_dec_return(int *v)\r
-{\r
-    return atomic_sub_return(1, v);\r
-}\r
-\r
-/**\r
- * atomic_sub_and_test - subtract value from variable and test result\r
- * @i: integer value to subtract\r
- * @v: pointer of type int\r
- *\r
- * Atomically subtracts @i from @v and returns\r
- * true if the result is zero, or false for all\r
- * other cases.\r
- */\r
-static inline int atomic_sub_and_test(int i, int *v)\r
-{\r
-    return (atomic_sub_return(i, v) == 0);\r
-}\r
-\r
-/**\r
- * atomic_inc_and_test - increment and test\r
- * @v: pointer of type int\r
- *\r
- * Atomically increments @v by 1\r
- * and returns true if the result is zero, or false for all\r
- * other cases.\r
- */\r
-static inline int atomic_inc_and_test(int *v)\r
-{\r
-    return (atomic_inc_return(v) == 0);\r
-}\r
-\r
-/**\r
- * atomic_dec_and_test - decrement and test\r
- * @v: pointer of type int\r
- *\r
- * Atomically decrements @v by 1 and\r
- * returns true if the result is 0, or false for all other\r
- * cases.\r
- */\r
-static inline int atomic_dec_and_test(int *v)\r
-{\r
-    return (atomic_dec_return(v) == 0);\r
-}\r
-\r
-/**\r
- * atomic_add_negative - add and test if negative\r
- * @i: integer value to add\r
- * @v: pointer of type int\r
- *\r
- * Atomically adds @i to @v and returns true\r
- * if the result is negative, or false when\r
- * result is greater than or equal to zero.\r
- */\r
-static inline int atomic_add_negative(int i, int *v)\r
-{\r
-    return (atomic_add_return(i, v) < 0);\r
-}\r
-\r
-static inline int atomic_xchg(int *v, int n)\r
-{\r
-    register int c;\r
-    __asm__ __volatile__ (\r
-        "amoswap.w %0, %2, %1"\r
-        : "=r" (c), "+A" (*v)\r
-        : "r" (n));\r
-    return c;\r
-}\r
-\r
-/**\r
- * atomic_and - Atomically clear bits in atomic variable\r
- * @mask: Mask of the bits to be retained\r
- * @v: pointer of type int\r
- *\r
- * Atomically retains the bits set in @mask from @v\r
- */\r
-static inline void atomic_and(unsigned int mask, int *v)\r
-{\r
-    __asm__ __volatile__ (\r
-        "amoand.w zero, %1, %0"\r
-        : "+A" (*v)\r
-        : "r" (mask));\r
-}\r
-\r
-static inline int atomic_fetch_and(unsigned int mask, int *v)\r
-{\r
-    int out;\r
-    __asm__ __volatile__ (\r
-        "amoand.w %2, %1, %0"\r
-        : "+A" (*v), "=r" (out)\r
-        : "r" (mask));\r
-    return out;\r
-}\r
-\r
-/**\r
- * atomic_or - Atomically set bits in atomic variable\r
- * @mask: Mask of the bits to be set\r
- * @v: pointer of type int\r
- *\r
- * Atomically sets the bits set in @mask in @v\r
- */\r
-static inline void atomic_or(unsigned int mask, int *v)\r
-{\r
-    __asm__ __volatile__ (\r
-        "amoor.w zero, %1, %0"\r
-        : "+A" (*v)\r
-        : "r" (mask));\r
-}\r
-\r
-static inline int atomic_fetch_or(unsigned int mask, int *v)\r
-{\r
-    int out;\r
-    __asm__ __volatile__ (\r
-        "amoor.w %2, %1, %0"\r
-        : "+A" (*v), "=r" (out)\r
-        : "r" (mask));\r
-    return out;\r
-}\r
-\r
-/**\r
- * atomic_xor - Atomically flips bits in atomic variable\r
- * @mask: Mask of the bits to be flipped\r
- * @v: pointer of type int\r
- *\r
- * Atomically flips the bits set in @mask in @v\r
- */\r
-static inline void atomic_xor(unsigned int mask, int *v)\r
-{\r
-    __asm__ __volatile__ (\r
-        "amoxor.w zero, %1, %0"\r
-        : "+A" (*v)\r
-        : "r" (mask));\r
-}\r
-\r
-static inline int atomic_fetch_xor(unsigned int mask, int *v)\r
-{\r
-    int out;\r
-    __asm__ __volatile__ (\r
-        "amoxor.w %2, %1, %0"\r
-        : "+A" (*v), "=r" (out)\r
-        : "r" (mask));\r
-    return out;\r
-}\r
-\r
-/*----------------------------------------------------*/\r
-\r
-/**\r
- * test_and_set_bit - Set a bit and return its old value\r
- * @nr: Bit to set\r
- * @addr: Address to count from\r
- *\r
- * This operation is atomic and cannot be reordered.\r
- * It also implies a memory barrier.\r
- */\r
-static inline int test_and_set_bit(int nr, volatile unsigned long *addr)\r
-{\r
-    unsigned long __res, __mask;\r
-    __mask = MASK(nr);\r
-    __asm__ __volatile__ (                \\r
-        "amoor.w %0, %2, %1"            \\r
-        : "=r" (__res), "+A" (*addr)    \\r
-        : "r" (__mask));                \\r
-\r
-        return ((__res & __mask) != 0);\r
-}\r
-\r
-\r
-/**\r
- * test_and_clear_bit - Clear a bit and return its old value\r
- * @nr: Bit to clear\r
- * @addr: Address to count from\r
- *\r
- * This operation is atomic and cannot be reordered.\r
- * It also implies a memory barrier.\r
- */\r
-static inline int test_and_clear_bit(int nr, volatile unsigned long *addr)\r
-{\r
-    unsigned long __res, __mask;\r
-    __mask = MASK_NOT(nr);\r
-    __asm__ __volatile__ (                \\r
-        "amoand.w %0, %2, %1"            \\r
-        : "=r" (__res), "+A" (*addr)    \\r
-        : "r" (__mask));                \\r
-\r
-        return ((__res & __mask) != 0);\r
-}\r
-\r
-/**\r
- * test_and_change_bit - Change a bit and return its old value\r
- * @nr: Bit to change\r
- * @addr: Address to count from\r
- *\r
- * This operation is atomic and cannot be reordered.\r
- * It also implies a memory barrier.\r
- */\r
-static inline int test_and_change_bit(int nr, volatile unsigned long *addr)\r
-{\r
-\r
-    unsigned long __res, __mask;\r
-    __mask = MASK(nr);\r
-    __asm__ __volatile__ (                \\r
-        "amoxor.w %0, %2, %1"            \\r
-        : "=r" (__res), "+A" (*addr)    \\r
-        : "r" (__mask));                \\r
-\r
-        return ((__res & __mask) != 0);\r
-}\r
-\r
-/**\r
- * set_bit - Atomically set a bit in memory\r
- * @nr: the bit to set\r
- * @addr: the address to start counting from\r
- *\r
- * This function is atomic and may not be reordered. \r
- */\r
-\r
-static inline void set_bit(int nr, volatile unsigned long *addr)\r
-{\r
-    __asm__ __volatile__ (                    \\r
-        "AMOOR.w zero, %1, %0"            \\r
-        : "+A" (*addr)            \\r
-        : "r" (MASK(nr)));\r
-}\r
-\r
-/**\r
- * clear_bit - Clears a bit in memory\r
- * @nr: Bit to clear\r
- * @addr: Address to start counting from\r
- *\r
- * clear_bit() is atomic and may not be reordered.  \r
- */\r
-static inline void clear_bit(int nr, volatile unsigned long *addr)\r
-{\r
-    __asm__ __volatile__ (                    \\r
-        "AMOAND.w zero, %1, %0"            \\r
-        : "+A" (*addr)            \\r
-        : "r" (MASK_NOT(nr)));\r
-}\r
-\r
-/**\r
- * change_bit - Toggle a bit in memory\r
- * @nr: Bit to change\r
- * @addr: Address to start counting from\r
- *\r
- * change_bit() is atomic and may not be reordered.\r
- */\r
-static inline void change_bit(int nr, volatile unsigned long *addr)\r
-{\r
-    __asm__ __volatile__ (                    \\r
-            "AMOXOR.w zero, %1, %0"            \\r
-            : "+A" (*addr)            \\r
-            : "r" (MASK(nr)));\r
-}\r
-\r
-#endif /* __riscv_atomic */\r
-\r
-#endif  /*__GNUC__*/\r
-\r
-#endif  /*__ASSEMBLER__*/\r
-\r
-#endif  /*__riscv*/\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif    /*RISCV_CSR_ENCODING_H*/\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/entry.S b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/entry.S
deleted file mode 100644 (file)
index fce18d7..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
- *\r
- * @file entry.S\r
- * @author Microsemi SoC Products Group\r
- * @brief Mi-V soft processor vectors, trap handling and startup code.\r
- *\r
- * SVN $Revision: 9947 $\r
- * SVN $Date: 2018-04-30 20:28:49 +0530 (Mon, 30 Apr 2018) $\r
- */\r
-#ifndef ENTRY_S\r
-#define ENTRY_S\r
-\r
-#include "encoding.h"\r
-\r
-#if __riscv_xlen == 64\r
-# define LREG ld\r
-# define SREG sd\r
-# define REGBYTES 8\r
-#else\r
-# define LREG lw\r
-# define SREG sw\r
-# define REGBYTES 4\r
-#endif\r
-\r
-  .section      .text.entry\r
-  .extern vFreeRTOSPortTrapHandler\r
-  .globl _start\r
-\r
-_start:\r
-  j handle_reset\r
-\r
-nmi_vector:\r
-  j nmi_vector\r
-\r
-trap_vector:\r
-  j vFreeRTOSPortTrapHandler\r
-\r
-handle_reset:\r
-  la t0, vFreeRTOSPortTrapHandler\r
-  csrw mtvec, t0\r
-  csrwi mstatus, 0\r
-  csrwi mie, 0\r
-\r
-/*Floating point support configuration*/\r
-\r
-#ifdef __riscv_flen\r
-  csrr t0, mstatus\r
-  lui t1, 0xffffa\r
-  addi t1, t1, -1\r
-  and t0, t0, t1\r
-  lui t1, 0x4\r
-  or t1, t0, t1\r
-  csrw mstatus, t1\r
-\r
-  lui t0, 0x0\r
-  fscsr t0\r
-#endif\r
-.option push\r
-\r
-# Ensure the instruction is not optimized, since gp is not yet set\r
-\r
-.option norelax\r
-  # initialize global pointer\r
-  la gp, __global_pointer$\r
-\r
-.option pop\r
-\r
-  # initialize stack pointer\r
-  la sp, __stack_top\r
-\r
-  # perform the rest of initialization in C\r
-  j _init\r
-\r
-#if 0\r
-trap_entry:\r
-  addi sp, sp, -32*REGBYTES\r
-\r
-  SREG x1, 0 * REGBYTES(sp)\r
-  SREG x2, 1 * REGBYTES(sp)\r
-  SREG x3, 2 * REGBYTES(sp)\r
-  SREG x4, 3 * REGBYTES(sp)\r
-  SREG x5, 4 * REGBYTES(sp)\r
-  SREG x6, 5 * REGBYTES(sp)\r
-  SREG x7, 6 * REGBYTES(sp)\r
-  SREG x8, 7 * REGBYTES(sp)\r
-  SREG x9, 8 * REGBYTES(sp)\r
-  SREG x10, 9 * REGBYTES(sp)\r
-  SREG x11, 10 * REGBYTES(sp)\r
-  SREG x12, 11 * REGBYTES(sp)\r
-  SREG x13, 12 * REGBYTES(sp)\r
-  SREG x14, 13 * REGBYTES(sp)\r
-  SREG x15, 14 * REGBYTES(sp)\r
-  SREG x16, 15 * REGBYTES(sp)\r
-  SREG x17, 16 * REGBYTES(sp)\r
-  SREG x18, 17 * REGBYTES(sp)\r
-  SREG x19, 18 * REGBYTES(sp)\r
-  SREG x20, 19 * REGBYTES(sp)\r
-  SREG x21, 20 * REGBYTES(sp)\r
-  SREG x22, 21 * REGBYTES(sp)\r
-  SREG x23, 22 * REGBYTES(sp)\r
-  SREG x24, 23 * REGBYTES(sp)\r
-  SREG x25, 24 * REGBYTES(sp)\r
-  SREG x26, 25 * REGBYTES(sp)\r
-  SREG x27, 26 * REGBYTES(sp)\r
-  SREG x28, 27 * REGBYTES(sp)\r
-  SREG x29, 28 * REGBYTES(sp)\r
-  SREG x30, 29 * REGBYTES(sp)\r
-  SREG x31, 30 * REGBYTES(sp)\r
-\r
-\r
-  csrr t0, mepc\r
-  SREG t0, 31 * REGBYTES(sp)\r
-\r
-  csrr a0, mcause\r
-  csrr a1, mepc\r
-  mv a2, sp\r
-  jal handle_trap\r
-  csrw mepc, a0\r
-\r
-  # Remain in M-mode after mret\r
-  li t0, MSTATUS_MPP\r
-  csrs mstatus, t0\r
-\r
-  LREG x1, 0 * REGBYTES(sp)\r
-  LREG x2, 1 * REGBYTES(sp)\r
-  LREG x3, 2 * REGBYTES(sp)\r
-  LREG x4, 3 * REGBYTES(sp)\r
-  LREG x5, 4 * REGBYTES(sp)\r
-  LREG x6, 5 * REGBYTES(sp)\r
-  LREG x7, 6 * REGBYTES(sp)\r
-  LREG x8, 7 * REGBYTES(sp)\r
-  LREG x9, 8 * REGBYTES(sp)\r
-  LREG x10, 9 * REGBYTES(sp)\r
-  LREG x11, 10 * REGBYTES(sp)\r
-  LREG x12, 11 * REGBYTES(sp)\r
-  LREG x13, 12 * REGBYTES(sp)\r
-  LREG x14, 13 * REGBYTES(sp)\r
-  LREG x15, 14 * REGBYTES(sp)\r
-  LREG x16, 15 * REGBYTES(sp)\r
-  LREG x17, 16 * REGBYTES(sp)\r
-  LREG x18, 17 * REGBYTES(sp)\r
-  LREG x19, 18 * REGBYTES(sp)\r
-  LREG x20, 19 * REGBYTES(sp)\r
-  LREG x21, 20 * REGBYTES(sp)\r
-  LREG x22, 21 * REGBYTES(sp)\r
-  LREG x23, 22 * REGBYTES(sp)\r
-  LREG x24, 23 * REGBYTES(sp)\r
-  LREG x25, 24 * REGBYTES(sp)\r
-  LREG x26, 25 * REGBYTES(sp)\r
-  LREG x27, 26 * REGBYTES(sp)\r
-  LREG x28, 27 * REGBYTES(sp)\r
-  LREG x29, 28 * REGBYTES(sp)\r
-  LREG x30, 29 * REGBYTES(sp)\r
-  LREG x31, 30 * REGBYTES(sp)\r
-\r
-  addi sp, sp, 32*REGBYTES\r
-  mret\r
-#endif /* 0 */\r
-\r
-#endif\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/init.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/init.c
deleted file mode 100644 (file)
index 8c5998f..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
- *\r
- * @file init.c\r
- * @author Microsemi SoC Products Group\r
- * @brief Mi-V soft processor memory section initializations and start-up code.\r
- *\r
- * SVN $Revision: 9661 $\r
- * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
- */\r
-\r
-#include <stdlib.h>\r
-#include <stdint.h>\r
-#include <unistd.h>\r
-\r
-#include "encoding.h"\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-extern uint32_t     __sdata_load;\r
-extern uint32_t     __sdata_start;\r
-extern uint32_t     __sdata_end;\r
-\r
-extern uint32_t     __data_load;\r
-extern uint32_t     __data_start;\r
-extern uint32_t     __data_end;\r
-\r
-extern uint32_t     __sbss_start;\r
-extern uint32_t     __sbss_end;\r
-extern uint32_t     __bss_start;\r
-extern uint32_t     __bss_end;\r
-\r
-\r
-static void copy_section(uint32_t * p_load, uint32_t * p_vma, uint32_t * p_vma_end)\r
-{\r
-    while(p_vma <= p_vma_end)\r
-    {\r
-        *p_vma = *p_load;\r
-        ++p_load;\r
-        ++p_vma;\r
-    }\r
-}\r
-\r
-static void zero_section(uint32_t * start, uint32_t * end)\r
-{\r
-    uint32_t * p_zero = start;\r
-    \r
-    while(p_zero <= end)\r
-    {\r
-        *p_zero = 0;\r
-        ++p_zero;\r
-    }\r
-}\r
-\r
-void _init(void)\r
-{\r
-    extern int main(int, char**);\r
-    const char *argv0 = "hello";\r
-    char *argv[] = {(char *)argv0, NULL, NULL};\r
-\r
-    copy_section(&__sdata_load, &__sdata_start, &__sdata_end);\r
-    copy_section(&__data_load, &__data_start, &__data_end);\r
-    zero_section(&__sbss_start, &__sbss_end);\r
-    zero_section(&__bss_start, &__bss_end);\r
-    \r
-    main(1, argv);\r
-}\r
-\r
-/* Function called after main() finishes */\r
-void\r
-_fini()\r
-{\r
-}\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-igloo2.ld b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-igloo2.ld
deleted file mode 100644 (file)
index 68d030d..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
- *\r
- * file name : microsemi-riscv-igloo2.ld\r
- * Mi-V soft processor linker script for creating a SoftConsole downloadable\r
- * image executing in eNVM.\r
- *\r
- * This linker script assumes that the eNVM is connected at on the Mi-V soft\r
- * processor memory space.\r
- *\r
- * SVN $Revision: 9661 $\r
- * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
- */\r
-\r
-OUTPUT_ARCH( "riscv" )\r
-ENTRY(_start)\r
-\r
-\r
-MEMORY\r
-{\r
-    envm (rx) : ORIGIN = 0x60000000, LENGTH = 240k\r
-    ram (rwx) : ORIGIN = 0x80000000, LENGTH = 64k\r
-}\r
-\r
-RAM_START_ADDRESS   = 0x80000000;       /* Must be the same value MEMORY region ram ORIGIN above. */\r
-RAM_SIZE            = 64k;              /* Must be the same value MEMORY region ram LENGTH above. */\r
-STACK_SIZE          = 2k;               /* needs to be calculated for your application */\r
-HEAP_SIZE           = 2k;               /* needs to be calculated for your application */\r
-\r
-SECTIONS\r
-{\r
-  .text : ALIGN(0x10)\r
-  {\r
-    KEEP (*(SORT_NONE(.text.entry)))\r
-    . = ALIGN(0x10);\r
-    *(.text .text.* .gnu.linkonce.t.*)\r
-    *(.plt)\r
-    . = ALIGN(0x10);\r
-\r
-    KEEP (*crtbegin.o(.ctors))\r
-    KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\r
-    KEEP (*(SORT(.ctors.*)))\r
-    KEEP (*crtend.o(.ctors))\r
-    KEEP (*crtbegin.o(.dtors))\r
-    KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\r
-    KEEP (*(SORT(.dtors.*)))\r
-    KEEP (*crtend.o(.dtors))\r
-\r
-    *(.rodata .rodata.* .gnu.linkonce.r.*)\r
-    *(.gcc_except_table)\r
-    *(.eh_frame_hdr)\r
-    *(.eh_frame)\r
-\r
-    KEEP (*(.init))\r
-    KEEP (*(.fini))\r
-\r
-    PROVIDE_HIDDEN (__preinit_array_start = .);\r
-    KEEP (*(.preinit_array))\r
-    PROVIDE_HIDDEN (__preinit_array_end = .);\r
-    PROVIDE_HIDDEN (__init_array_start = .);\r
-    KEEP (*(SORT(.init_array.*)))\r
-    KEEP (*(.init_array))\r
-    PROVIDE_HIDDEN (__init_array_end = .);\r
-    PROVIDE_HIDDEN (__fini_array_start = .);\r
-    KEEP (*(.fini_array))\r
-    KEEP (*(SORT(.fini_array.*)))\r
-    PROVIDE_HIDDEN (__fini_array_end = .);\r
-    . = ALIGN(0x10);\r
-\r
-  } >envm\r
-\r
-  /* short/global data section */\r
-  .sdata : ALIGN(0x10)\r
-  {\r
-    __sdata_load = LOADADDR(.sdata);\r
-    __sdata_start = .;\r
-    PROVIDE( __global_pointer$ = . + 0x800);\r
-    *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2)\r
-    *(.srodata*)\r
-    *(.sdata .sdata.* .gnu.linkonce.s.*)\r
-    . = ALIGN(0x10);\r
-    __sdata_end = .;\r
-  } >ram AT>envm\r
-\r
-  /* data section */\r
-  .data : ALIGN(0x10)\r
-  {\r
-    __data_load = LOADADDR(.data);\r
-    __data_start = .;\r
-    *(.got.plt) *(.got)\r
-    *(.shdata)\r
-    *(.data .data.* .gnu.linkonce.d.*)\r
-    . = ALIGN(0x10);\r
-    __data_end = .;\r
-  } >ram AT>envm\r
-\r
-  /* sbss section */\r
-  .sbss : ALIGN(0x10)\r
-  {\r
-    __sbss_start = .;\r
-    *(.sbss .sbss.* .gnu.linkonce.sb.*)\r
-    *(.scommon)\r
-    . = ALIGN(0x10);\r
-    __sbss_end = .;\r
-  } > ram\r
-\r
-  /* sbss section */\r
-  .bss : ALIGN(0x10)\r
-  {\r
-    __bss_start = .;\r
-    *(.shbss)\r
-    *(.bss .bss.* .gnu.linkonce.b.*)\r
-    *(COMMON)\r
-    . = ALIGN(0x10);\r
-    __bss_end = .;\r
-  } > ram\r
-\r
-  /* End of uninitialized data segment */\r
-  _end = .;\r
-\r
-  .heap : ALIGN(0x10)\r
-  {\r
-    __heap_start = .;\r
-    . += HEAP_SIZE;\r
-    __heap_end = .;\r
-    . = ALIGN(0x10);\r
-    _heap_end = __heap_end;\r
-  } > ram\r
-\r
-  .stack : ALIGN(0x10)\r
-  {\r
-    __stack_bottom = .;\r
-    . += STACK_SIZE;\r
-    __stack_top = .;\r
-    _sp = .;\r
-       __freertos_irq_stack_top = .;\r
-  } > ram\r
-}\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-ram.ld b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-ram.ld
deleted file mode 100644 (file)
index 305cb0e..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
- *\r
- * file name : microsemi-riscv-ram.ld\r
- * Mi-V soft processor linker script for creating a SoftConsole downloadable\r
- * debug image executing in SRAM.\r
- *\r
- * This linker script assumes that the SRAM is connected at on the Mi-V soft\r
- * processor memory space. The start address and size of the memory space must\r
- * be correct as per the Libero design.\r
- *\r
- * SVN $Revision: 9661 $\r
- * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
- */\r
-\r
-OUTPUT_ARCH( "riscv" )\r
-ENTRY(_start)\r
-\r
-\r
-MEMORY\r
-{\r
-    ram (rwx) : ORIGIN = 0x80000000, LENGTH = 512k\r
-}\r
-\r
-RAM_START_ADDRESS   = 0x80000000;       /* Must be the same value MEMORY region ram ORIGIN above. */\r
-RAM_SIZE            = 512k;              /* Must be the same value MEMORY region ram LENGTH above. */\r
-STACK_SIZE          = 64k;               /* needs to be calculated for your application */\r
-HEAP_SIZE           = 64k;               /* needs to be calculated for your application */\r
-\r
-SECTIONS\r
-{\r
-  .text : ALIGN(0x10)\r
-  {\r
-    KEEP (*(SORT_NONE(.text.entry)))\r
-    . = ALIGN(0x10);\r
-    *(.text .text.* .gnu.linkonce.t.*)\r
-    *(.plt)\r
-    . = ALIGN(0x10);\r
-\r
-    KEEP (*crtbegin.o(.ctors))\r
-    KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\r
-    KEEP (*(SORT(.ctors.*)))\r
-    KEEP (*crtend.o(.ctors))\r
-    KEEP (*crtbegin.o(.dtors))\r
-    KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\r
-    KEEP (*(SORT(.dtors.*)))\r
-    KEEP (*crtend.o(.dtors))\r
-\r
-    *(.rodata .rodata.* .gnu.linkonce.r.*)\r
-    *(.gcc_except_table)\r
-    *(.eh_frame_hdr)\r
-    *(.eh_frame)\r
-\r
-    KEEP (*(.init))\r
-    KEEP (*(.fini))\r
-\r
-    PROVIDE_HIDDEN (__preinit_array_start = .);\r
-    KEEP (*(.preinit_array))\r
-    PROVIDE_HIDDEN (__preinit_array_end = .);\r
-    PROVIDE_HIDDEN (__init_array_start = .);\r
-    KEEP (*(SORT(.init_array.*)))\r
-    KEEP (*(.init_array))\r
-    PROVIDE_HIDDEN (__init_array_end = .);\r
-    PROVIDE_HIDDEN (__fini_array_start = .);\r
-    KEEP (*(.fini_array))\r
-    KEEP (*(SORT(.fini_array.*)))\r
-    PROVIDE_HIDDEN (__fini_array_end = .);\r
-    . = ALIGN(0x10);\r
-\r
-  } > ram\r
-\r
-  /* short/global data section */\r
-  .sdata : ALIGN(0x10)\r
-  {\r
-    __sdata_load = LOADADDR(.sdata);\r
-    __sdata_start = .;\r
-    PROVIDE( __global_pointer$ = . + 0x800);\r
-    *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2)\r
-    *(.srodata*)\r
-    *(.sdata .sdata.* .gnu.linkonce.s.*)\r
-    . = ALIGN(0x10);\r
-    __sdata_end = .;\r
-  } > ram\r
-\r
-  /* data section */\r
-  .data : ALIGN(0x10)\r
-  {\r
-    __data_load = LOADADDR(.data);\r
-    __data_start = .;\r
-    *(.got.plt) *(.got)\r
-    *(.shdata)\r
-    *(.data .data.* .gnu.linkonce.d.*)\r
-    . = ALIGN(0x10);\r
-    __data_end = .;\r
-  } > ram\r
-\r
-  /* sbss section */\r
-  .sbss : ALIGN(0x10)\r
-  {\r
-    __sbss_start = .;\r
-    *(.sbss .sbss.* .gnu.linkonce.sb.*)\r
-    *(.scommon)\r
-    . = ALIGN(0x10);\r
-    __sbss_end = .;\r
-  } > ram\r
-\r
-  /* sbss section */\r
-  .bss : ALIGN(0x10)\r
-  {\r
-    __bss_start = .;\r
-    *(.shbss)\r
-    *(.bss .bss.* .gnu.linkonce.b.*)\r
-    *(COMMON)\r
-    . = ALIGN(0x10);\r
-    __bss_end = .;\r
-  } > ram\r
-\r
-  /* End of uninitialized data segment */\r
-  _end = .;\r
-\r
-  .heap : ALIGN(0x10)\r
-  {\r
-    __heap_start = .;\r
-    . += HEAP_SIZE;\r
-    __heap_end = .;\r
-    . = ALIGN(0x10);\r
-    _heap_end = __heap_end;\r
-  } > ram\r
-\r
-  .stack : ALIGN(0x10)\r
-  {\r
-    __stack_bottom = .;\r
-    . += STACK_SIZE;\r
-    __stack_top = .;\r
-    _sp = .;\r
-       __freertos_irq_stack_top = .;\r
-  } > ram\r
-}\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.c
deleted file mode 100644 (file)
index 14ecf7b..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2016-2018 Microsemi SoC Products Group. All rights reserved.\r
- *\r
- * @file riscv_hal.c\r
- * @author Microsemi SoC Products Group\r
- * @brief Implementation of Hardware Abstraction Layer for Mi-V soft processors\r
- *\r
- * SVN $Revision: 9835 $\r
- * SVN $Date: 2018-03-19 19:11:35 +0530 (Mon, 19 Mar 2018) $\r
- */\r
-#include <stdlib.h>\r
-#include <stdint.h>\r
-#include <unistd.h>\r
-\r
-#include "riscv_hal.h"\r
-\r
-#include "FreeRTOS.h"\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-#define RTC_PRESCALER 100UL\r
-\r
-#define SUCCESS 0U\r
-#define ERROR   1U\r
-\r
-/*------------------------------------------------------------------------------\r
- *\r
- */\r
-uint8_t Invalid_IRQHandler(void);\r
-uint8_t External_1_IRQHandler(void);\r
-uint8_t External_2_IRQHandler(void);\r
-uint8_t External_3_IRQHandler(void);\r
-uint8_t External_4_IRQHandler(void);\r
-uint8_t External_5_IRQHandler(void);\r
-uint8_t External_6_IRQHandler(void);\r
-uint8_t External_7_IRQHandler(void);\r
-uint8_t External_8_IRQHandler(void);\r
-uint8_t External_9_IRQHandler(void);\r
-uint8_t External_10_IRQHandler(void);\r
-uint8_t External_11_IRQHandler(void);\r
-uint8_t External_12_IRQHandler(void);\r
-uint8_t External_13_IRQHandler(void);\r
-uint8_t External_14_IRQHandler(void);\r
-uint8_t External_15_IRQHandler(void);\r
-uint8_t External_16_IRQHandler(void);\r
-uint8_t External_17_IRQHandler(void);\r
-uint8_t External_18_IRQHandler(void);\r
-uint8_t External_19_IRQHandler(void);\r
-uint8_t External_20_IRQHandler(void);\r
-uint8_t External_21_IRQHandler(void);\r
-uint8_t External_22_IRQHandler(void);\r
-uint8_t External_23_IRQHandler(void);\r
-uint8_t External_24_IRQHandler(void);\r
-uint8_t External_25_IRQHandler(void);\r
-uint8_t External_26_IRQHandler(void);\r
-uint8_t External_27_IRQHandler(void);\r
-uint8_t External_28_IRQHandler(void);\r
-uint8_t External_29_IRQHandler(void);\r
-uint8_t External_30_IRQHandler(void);\r
-uint8_t External_31_IRQHandler(void);\r
-\r
-/*------------------------------------------------------------------------------\r
- *\r
- */\r
-extern void Software_IRQHandler(void);\r
-extern void Timer_IRQHandle( void );\r
-\r
-/*------------------------------------------------------------------------------\r
- * RISC-V interrupt handler for external interrupts.\r
- */\r
-uint8_t (*ext_irq_handler_table[32])(void) =\r
-{\r
-    Invalid_IRQHandler,\r
-    External_1_IRQHandler,\r
-    External_2_IRQHandler,\r
-    External_3_IRQHandler,\r
-    External_4_IRQHandler,\r
-    External_5_IRQHandler,\r
-    External_6_IRQHandler,\r
-    External_7_IRQHandler,\r
-    External_8_IRQHandler,\r
-    External_9_IRQHandler,\r
-    External_10_IRQHandler,\r
-    External_11_IRQHandler,\r
-    External_12_IRQHandler,\r
-    External_13_IRQHandler,\r
-    External_14_IRQHandler,\r
-    External_15_IRQHandler,\r
-    External_16_IRQHandler,\r
-    External_17_IRQHandler,\r
-    External_18_IRQHandler,\r
-    External_19_IRQHandler,\r
-    External_20_IRQHandler,\r
-    External_21_IRQHandler,\r
-    External_22_IRQHandler,\r
-    External_23_IRQHandler,\r
-    External_24_IRQHandler,\r
-    External_25_IRQHandler,\r
-    External_26_IRQHandler,\r
-    External_27_IRQHandler,\r
-    External_28_IRQHandler,\r
-    External_29_IRQHandler,\r
-    External_30_IRQHandler,\r
-    External_31_IRQHandler\r
-};\r
-\r
-/*------------------------------------------------------------------------------\r
- *\r
- */\r
-void handle_m_ext_interrupt(void)\r
-{\r
-    uint32_t int_num  = PLIC_ClaimIRQ();\r
-    uint8_t disable = EXT_IRQ_KEEP_ENABLED;\r
-\r
-    disable = ext_irq_handler_table[int_num]();\r
-\r
-    PLIC_CompleteIRQ(int_num);\r
-\r
-    if(EXT_IRQ_DISABLE == disable)\r
-    {\r
-        PLIC_DisableIRQ((IRQn_Type)int_num);\r
-    }\r
-}\r
-\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.h
deleted file mode 100644 (file)
index 7c3835f..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2016-2018 Microsemi SoC Products Group. All rights reserved.\r
- *\r
- * @file riscv_hal.h\r
- * @author Microsemi SoC Products Group\r
- * @brief Hardware Abstraction Layer functions for Mi-V soft processors\r
- *\r
- * SVN $Revision: 9835 $\r
- * SVN $Date: 2018-03-19 19:11:35 +0530 (Mon, 19 Mar 2018) $\r
- */\r
-\r
-#ifndef RISCV_HAL_H\r
-#define RISCV_HAL_H\r
-\r
-#include "riscv_plic.h"\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-/*\r
- *Return value from External IRQ handler. This will be used to disable the External\r
- *interrupt.\r
- */\r
-#define EXT_IRQ_KEEP_ENABLED                0U\r
-#define EXT_IRQ_DISABLE                     1U\r
-\r
-/*------------------------------------------------------------------------------\r
- * Interrupt enable/disable.\r
- */\r
-void __disable_irq(void);\r
-void __enable_irq(void);\r
-\r
-/*------------------------------------------------------------------------------\r
- *  System tick handler. This is generated from the RISC-V machine timer.\r
- */\r
-void SysTick_Handler(void);\r
-\r
-/*------------------------------------------------------------------------------\r
- * System tick configuration.\r
- * Configures the machine timer to generate a system tick interrupt at regular\r
- * intervals.\r
- * Takes the number of system clock ticks between interrupts.\r
- *\r
- * Returns 0 if successful.\r
- * Returns 1 if the interrupt interval cannot be achieved.\r
- */\r
-uint32_t SysTick_Config(uint32_t ticks);\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif  /* RISCV_HAL_H */\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal_stubs.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal_stubs.c
deleted file mode 100644 (file)
index 29a4f40..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2016-2018 Microsemi SoC Products Group. All rights reserved.\r
- *\r
- * @file riscv_hal_stubs.c\r
- * @author Microsemi SoC Products Group\r
- * @brief Mi-V soft processor Interrupt Function stubs.\r
- * The functions below will only be linked with the application code if the user\r
- * does not provide an implementation for these functions. These functions are\r
- * defined with weak linking so that they can be overridden by a function with\r
- * same prototype in the user's application code.\r
- *\r
- * SVN $Revision: 9835 $\r
- * SVN $Date: 2018-03-19 19:11:35 +0530 (Mon, 19 Mar 2018) $\r
- */\r
-#include <unistd.h>\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) void Software_IRQHandler(void)\r
-{\r
-    _exit(10);\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) void SysTick_Handler(void)\r
-{\r
-       /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t Invalid_IRQHandler(void)\r
-{\r
-    return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_1_IRQHandler(void)\r
-{\r
-    return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_2_IRQHandler(void)\r
-{\r
-    return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_3_IRQHandler(void)\r
-{\r
-    return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_4_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_5_IRQHandler(void)\r
-{\r
-    return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_6_IRQHandler(void)\r
-{\r
-    return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_7_IRQHandler(void)\r
-{\r
-    return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_8_IRQHandler(void)\r
-{\r
-    return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_9_IRQHandler(void)\r
-{\r
-    return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_10_IRQHandler(void)\r
-{\r
-    return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_11_IRQHandler(void)\r
-{\r
-    return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_12_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_13_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_14_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_15_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_16_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_17_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_18_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_19_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_20_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_21_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_22_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_23_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_24_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_25_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_26_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_27_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_28_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_29_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
-__attribute__((weak)) uint8_t External_30_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-/*Weakly linked handler. Will be replaced with user's definition if provide*/\r
-__attribute__((weak)) uint8_t External_31_IRQHandler(void)\r
-{\r
-       return(0U); /*Default handler*/\r
-}\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_plic.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_plic.h
deleted file mode 100644 (file)
index 2d09518..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
- *\r
- * @file riscv_plic.h\r
- * @author Microsemi SoC Products Group\r
- * @brief Mi-V soft processor PLIC and PRCI access data structures and functions.\r
- *\r
- * SVN $Revision: 9838 $\r
- * SVN $Date: 2018-03-19 19:22:54 +0530 (Mon, 19 Mar 2018) $\r
- */\r
-#ifndef RISCV_PLIC_H\r
-#define RISCV_PLIC_H\r
-\r
-#include <stdint.h>\r
-\r
-#include "encoding.h"\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-#define PLIC_NUM_SOURCES 31\r
-#define PLIC_NUM_PRIORITIES 0\r
-\r
-/*==============================================================================\r
- * Interrupt numbers:\r
- */\r
-typedef enum\r
-{\r
-    NoInterrupt_IRQn = 0,\r
-    External_1_IRQn  = 1,\r
-    External_2_IRQn  = 2,\r
-    External_3_IRQn  = 3, \r
-    External_4_IRQn  = 4,\r
-    External_5_IRQn  = 5,\r
-    External_6_IRQn  = 6,\r
-    External_7_IRQn  = 7,\r
-    External_8_IRQn  = 8,\r
-    External_9_IRQn  = 9,\r
-    External_10_IRQn = 10,\r
-    External_11_IRQn = 11,\r
-    External_12_IRQn = 12,\r
-    External_13_IRQn = 13,\r
-    External_14_IRQn = 14,\r
-    External_15_IRQn = 15,\r
-    External_16_IRQn = 16,\r
-    External_17_IRQn = 17,\r
-    External_18_IRQn = 18,\r
-    External_19_IRQn = 19,\r
-    External_20_IRQn = 20,\r
-    External_21_IRQn = 21,\r
-    External_22_IRQn = 22,\r
-    External_23_IRQn = 23,\r
-    External_24_IRQn = 24,\r
-    External_25_IRQn = 25,\r
-    External_26_IRQn = 26,\r
-    External_27_IRQn = 27,\r
-    External_28_IRQn = 28,\r
-    External_29_IRQn = 29,\r
-    External_30_IRQn = 30,\r
-    External_31_IRQn = 31\r
-} IRQn_Type;\r
-\r
-\r
-/*==============================================================================\r
- * PLIC: Platform Level Interrupt Controller\r
- */\r
-#define PLIC_BASE_ADDR 0x40000000UL\r
-\r
-typedef struct\r
-{\r
-    volatile uint32_t PRIORITY_THRESHOLD;\r
-    volatile uint32_t CLAIM_COMPLETE;\r
-    volatile uint32_t reserved[1022];\r
-} IRQ_Target_Type;\r
-\r
-typedef struct\r
-{\r
-    volatile uint32_t ENABLES[32];\r
-} Target_Enables_Type;\r
-\r
-typedef struct\r
-{\r
-    /*-------------------- Source Priority --------------------*/\r
-    volatile uint32_t SOURCE_PRIORITY[1024];\r
-    \r
-    /*-------------------- Pending array --------------------*/\r
-    volatile const uint32_t PENDING_ARRAY[32];\r
-    volatile uint32_t RESERVED1[992];\r
-    \r
-    /*-------------------- Target enables --------------------*/\r
-    volatile Target_Enables_Type TARGET_ENABLES[15808];\r
-\r
-    volatile uint32_t RESERVED2[16384];\r
-    \r
-    /*--- Target Priority threshold and claim/complete---------*/\r
-    IRQ_Target_Type TARGET[15872];\r
-    \r
-} PLIC_Type;\r
-\r
-\r
-#define PLIC    ((PLIC_Type *)PLIC_BASE_ADDR)\r
-\r
-/*==============================================================================\r
- * PRCI: Power, Reset, Clock, Interrupt\r
- */\r
-#define PRCI_BASE   0x44000000UL\r
-\r
-typedef struct\r
-{\r
-    volatile uint32_t MSIP[4095];\r
-    volatile uint32_t reserved;\r
-    volatile uint64_t MTIMECMP[4095];\r
-    volatile const uint64_t MTIME;\r
-} PRCI_Type;\r
-\r
-#define PRCI    ((PRCI_Type *)PRCI_BASE) \r
-\r
-/*==============================================================================\r
- * The function PLIC_init() initializes the PLIC controller and enables the \r
- * global external interrupt bit.\r
- */\r
-static inline void PLIC_init(void)\r
-{\r
-    uint32_t inc;\r
-    unsigned long hart_id = read_csr(mhartid);\r
-\r
-    /* Disable all interrupts for the current hart. */\r
-    for(inc = 0; inc < ((PLIC_NUM_SOURCES + 32u) / 32u); ++inc)\r
-    {\r
-        PLIC->TARGET_ENABLES[hart_id].ENABLES[inc] = 0;\r
-    }\r
-\r
-    /* Set priorities to zero. */\r
-    /* Should this really be done??? Calling PLIC_init() on one hart will cause\r
-    * the priorities previously set by other harts to be messed up. */\r
-    for(inc = 0; inc < PLIC_NUM_SOURCES; ++inc)\r
-    {\r
-        PLIC->SOURCE_PRIORITY[inc] = 0;\r
-    }\r
-\r
-    /* Set the threshold to zero. */\r
-    PLIC->TARGET[hart_id].PRIORITY_THRESHOLD = 0;\r
-\r
-    /* Enable machine external interrupts. */\r
-    set_csr(mie, MIP_MEIP);\r
-}\r
-\r
-/*==============================================================================\r
- * The function PLIC_EnableIRQ() enables the external interrupt for the interrupt\r
- * number indicated by the parameter IRQn.\r
- */\r
-static inline void PLIC_EnableIRQ(IRQn_Type IRQn)\r
-{\r
-    unsigned long hart_id = read_csr(mhartid);\r
-    uint32_t current = PLIC->TARGET_ENABLES[hart_id].ENABLES[IRQn / 32];\r
-    current |= (uint32_t)1 << (IRQn % 32);\r
-    PLIC->TARGET_ENABLES[hart_id].ENABLES[IRQn / 32] = current;\r
-}\r
-\r
-/*==============================================================================\r
- * The function PLIC_DisableIRQ() disables the external interrupt for the interrupt\r
- * number indicated by the parameter IRQn.\r
-\r
- * NOTE:\r
- *     This function can be used to disable the external interrupt from outside\r
- *     external interrupt handler function.\r
- *     This function MUST NOT be used from within the External Interrupt handler.\r
- *     If you wish to disable the external interrupt while the interrupt handler\r
- *     for that external interrupt is executing then you must use the return value\r
- *     EXT_IRQ_DISABLE to return from the extern interrupt handler.\r
- */\r
-static inline void PLIC_DisableIRQ(IRQn_Type IRQn)\r
-{\r
-    unsigned long hart_id = read_csr(mhartid);\r
-    uint32_t current = PLIC->TARGET_ENABLES[hart_id].ENABLES[IRQn / 32];\r
-\r
-    current &= ~((uint32_t)1 << (IRQn % 32));\r
-\r
-    PLIC->TARGET_ENABLES[hart_id].ENABLES[IRQn / 32] = current;\r
-}\r
-\r
-/*==============================================================================\r
- * The function PLIC_SetPriority() sets the priority for the external interrupt \r
- * for the interrupt number indicated by the parameter IRQn.\r
- */\r
-static inline void PLIC_SetPriority(IRQn_Type IRQn, uint32_t priority) \r
-{\r
-    PLIC->SOURCE_PRIORITY[IRQn] = priority;\r
-}\r
-\r
-/*==============================================================================\r
- * The function PLIC_GetPriority() returns the priority for the external interrupt \r
- * for the interrupt number indicated by the parameter IRQn.\r
- */\r
-static inline uint32_t PLIC_GetPriority(IRQn_Type IRQn)\r
-{\r
-    return PLIC->SOURCE_PRIORITY[IRQn];\r
-}\r
-\r
-/*==============================================================================\r
- * The function PLIC_ClaimIRQ() claims the interrupt from the PLIC controller.\r
- */\r
-static inline uint32_t PLIC_ClaimIRQ(void)\r
-{\r
-    unsigned long hart_id = read_csr(mhartid);\r
-\r
-    return PLIC->TARGET[hart_id].CLAIM_COMPLETE;\r
-}\r
-\r
-/*==============================================================================\r
- * The function PLIC_CompleteIRQ() indicates to the PLIC controller the interrupt\r
- * is processed and claim is complete.\r
- */\r
-static inline void PLIC_CompleteIRQ(uint32_t source)\r
-{\r
-    unsigned long hart_id = read_csr(mhartid);\r
-\r
-    PLIC->TARGET[hart_id].CLAIM_COMPLETE = source;\r
-}\r
-\r
-/*==============================================================================\r
- * The function raise_soft_interrupt() raises a synchronous software interrupt by\r
- * writing into the MSIP register.\r
- */\r
-static inline void raise_soft_interrupt()\r
-{\r
-    unsigned long hart_id = read_csr(mhartid);\r
-\r
-    /*You need to make sure that the global interrupt is enabled*/\r
-    set_csr(mie, MIP_MSIP);       /*Enable software interrupt bit */\r
-    PRCI->MSIP[hart_id] = 0x01;   /*raise soft interrupt for hart0*/\r
-}\r
-\r
-/*==============================================================================\r
- * The function clear_soft_interrupt() clears a synchronous software interrupt by\r
- * clearing the MSIP register.\r
- */\r
-static inline void clear_soft_interrupt()\r
-{\r
-    unsigned long hart_id = read_csr(mhartid);\r
-    PRCI->MSIP[hart_id] = 0x00;   /*clear soft interrupt for hart0*/\r
-}\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif  /* RISCV_PLIC_H */\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/sample_hw_platform.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/sample_hw_platform.h
deleted file mode 100644 (file)
index d0604a1..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2016-2018 Microsemi Corporation.  All rights reserved.\r
- *\r
- * Platform definitions\r
- * Version based on requirements of RISCV-HAL\r
- *\r
- * SVN $Revision: 9946 $\r
- * SVN $Date: 2018-04-30 20:26:55 +0530 (Mon, 30 Apr 2018) $\r
- */\r
- /*=========================================================================*//**\r
-  @mainpage Sample file detailing how hw_platform.h should be constructed for \r
-    the Mi-V processors.\r
-\r
-    @section intro_sec Introduction\r
-    The hw_platform.h is to be located in the project root directory.\r
-    Currently this file must be hand crafted when using the Mi-V Soft Processor.\r
-    \r
-    You can use this file as sample.\r
-    Rename this file from sample_hw_platform.h to hw_platform.h and store it in\r
-    the root folder of your project. Then customize it per your HW design.\r
-\r
-    @section driver_configuration Project configuration Instructions\r
-    1. Change SYS_CLK_FREQ define to frequency of Mi-V Soft processor clock\r
-    2  Add all other core BASE addresses\r
-    3. Add peripheral Core Interrupt to Mi-V Soft processor interrupt mappings\r
-    4. Define MSCC_STDIO_UART_BASE_ADDR if you want a CoreUARTapb mapped to STDIO\r
-*//*=========================================================================*/\r
-\r
-#ifndef HW_PLATFORM_H\r
-#define HW_PLATFORM_H\r
-\r
-/***************************************************************************//**\r
- * Soft-processor clock definition\r
- * This is the only clock brought over from the Mi-V Soft processor Libero design.\r
- */\r
-#ifndef SYS_CLK_FREQ\r
-#define SYS_CLK_FREQ                    83000000UL\r
-#endif\r
-\r
-\r
-/***************************************************************************//**\r
- * Non-memory Peripheral base addresses\r
- * Format of define is:\r
- * <corename>_<instance>_BASE_ADDR\r
- */\r
-#define COREUARTAPB0_BASE_ADDR          0x70001000UL\r
-#define COREGPIO_BASE_ADDR              0x70002000UL\r
-#define COREGPIO_IN_BASE_ADDR           0x70002000UL\r
-#define CORETIMER0_BASE_ADDR            0x70003000UL\r
-#define CORETIMER1_BASE_ADDR            0x70004000UL\r
-#define COREGPIO_OUT_BASE_ADDR          0x70005000UL\r
-#define FLASH_CORE_SPI_BASE             0x70006000UL\r
-#define CORE16550_BASE_ADDR             0x70007000UL\r
-\r
-/***************************************************************************//**\r
- * Peripheral Interrupts are mapped to the corresponding Mi-V Soft processor\r
- * interrupt from the Libero design.\r
- * There can be up to 31 external interrupts (IRQ[30:0] pins) on the Mi-V Soft\r
- * processor.The Mi-V Soft processor external interrupts are defined in the\r
- * riscv_plic.h\r
- * These are of the form\r
- * typedef enum\r
-{\r
-    NoInterrupt_IRQn = 0,\r
-    External_1_IRQn  = 1,\r
-    External_2_IRQn  = 2,\r
-    .\r
-    .\r
-    .\r
-    External_31_IRQn = 31\r
-} IRQn_Type;\r
\r
- The interrupt 0 on RISC-V processor is not used. The pin IRQ[0] should map to\r
- External_1_IRQn likewise IRQ[30] should map to External_31_IRQn\r
- * Format of define is:\r
- * <corename>_<instance>_<core interrupt name>\r
- */\r
-\r
-#define TIMER0_IRQn                     External_30_IRQn\r
-#define TIMER1_IRQn                     External_31_IRQn\r
-\r
-/****************************************************************************\r
- * Baud value to achieve a 115200 baud rate with a 83MHz system clock.\r
- * This value is calculated using the following equation:\r
- *      BAUD_VALUE = (CLOCK / (16 * BAUD_RATE)) - 1\r
- *****************************************************************************/\r
-#define BAUD_VALUE_115200               (SYS_CLK_FREQ / (16 * 115200)) - 1\r
-\r
-/***************************************************************************//**\r
- * User edit section- Edit sections below if required\r
- */\r
-#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
-/*\r
- * A base address mapping for the STDIO printf/scanf mapping to CortUARTapb\r
- * must be provided if it is being used\r
- *\r
- * e.g. #define MSCC_STDIO_UART_BASE_ADDR COREUARTAPB1_BASE_ADDR\r
- */\r
-#define MSCC_STDIO_UART_BASE_ADDR COREUARTAPB0_BASE_ADDR\r
-\r
-#ifndef MSCC_STDIO_UART_BASE_ADDR\r
-#error MSCC_STDIO_UART_BASE_ADDR not defined- e.g. #define MSCC_STDIO_UART_BASE_ADDR COREUARTAPB1_BASE_ADDR\r
-#endif\r
-\r
-#ifndef MSCC_STDIO_BAUD_VALUE\r
-/*\r
- * The MSCC_STDIO_BAUD_VALUE define should be set in your project's settings to\r
- * specify the baud value used by the standard output CoreUARTapb instance for\r
- * generating the UART's baud rate if you want a different baud rate from the\r
- * default of 115200 baud\r
- */\r
-#define MSCC_STDIO_BAUD_VALUE           115200\r
-#endif  /*MSCC_STDIO_BAUD_VALUE*/\r
-\r
-#endif  /* end of MSCC_STDIO_THRU_CORE_UART_APB */\r
-/*******************************************************************************\r
- * End of user edit section\r
- */\r
-#endif /* HW_PLATFORM_H */\r
-\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/syscall.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/syscall.c
deleted file mode 100644 (file)
index 4c99f80..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
- *\r
- * @file syscall.c\r
- * @author Microsemi SoC Products Group\r
- * @brief Stubs for system calls.\r
- *\r
- * SVN $Revision: 9661 $\r
- * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
- */\r
-#include <stdint.h>\r
-#include <stdlib.h>\r
-#include <stddef.h>\r
-#include <unistd.h>\r
-#include <errno.h>\r
-#include <sys/stat.h>\r
-#include <sys/times.h>\r
-#include <stdio.h>\r
-#include <string.h>\r
-\r
-#include "encoding.h"\r
-\r
-#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
-\r
-#include "core_uart_apb.h"\r
-#include "hw_platform.h"\r
-\r
-#endif  /*MSCC_STDIO_THRU_CORE_UART_APB*/\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
-\r
-/*------------------------------------------------------------------------------\r
- * CoreUARTapb instance data for the CoreUARTapb instance used for standard\r
- * output.\r
- */\r
-static UART_instance_t g_stdio_uart;\r
-\r
-/*==============================================================================\r
- * Flag used to indicate if the UART driver needs to be initialized.\r
- */\r
-static int g_stdio_uart_init_done = 0;\r
-#endif /*MSCC_STDIO_THRU_CORE_UART_APB*/\r
-\r
-#undef errno\r
-int errno;\r
-\r
-char *__env[1] = { 0 };\r
-char **environ = __env;\r
-\r
-void write_hex(int fd, uint32_t hex)\r
-{\r
-    uint8_t ii;\r
-    uint8_t jj;\r
-    char towrite;\r
-    uint8_t digit;\r
-\r
-    write( fd , "0x", 2 );\r
-\r
-    for (ii = 8 ; ii > 0; ii--)\r
-    {\r
-        jj = ii-1;\r
-        digit = ((hex & (0xF << (jj*4))) >> (jj*4));\r
-        towrite = digit < 0xA ? ('0' + digit) : ('A' +  (digit - 0xA));\r
-        write( fd, &towrite, 1);\r
-    }\r
-}\r
-\r
-               \r
-void _exit(int code)\r
-{\r
-#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
-    const char * message = "\nProgam has exited with code:";\r
-\r
-    write(STDERR_FILENO, message, strlen(message));\r
-    write_hex(STDERR_FILENO, code);\r
-#endif\r
-\r
-    while (1);\r
-}\r
-\r
-void *_sbrk(ptrdiff_t incr)\r
-{\r
-    extern char _end[];\r
-    extern char _heap_end[];\r
-    static char *curbrk = _end;\r
-\r
-    if ((curbrk + incr < _end) || (curbrk + incr > _heap_end))\r
-    {\r
-        return ((char *) - 1);\r
-    }\r
-\r
-    curbrk += incr;\r
-    return curbrk - incr;\r
-}\r
-\r
-int _isatty(int fd)\r
-{\r
-    if (fd == STDOUT_FILENO || fd == STDERR_FILENO)\r
-    {\r
-        return 1;\r
-    }\r
-\r
-    errno = EBADF;\r
-    return 0;\r
-}\r
-\r
-static int stub(int err)\r
-{\r
-    errno = err;\r
-    return -1;\r
-}\r
-\r
-int _open(const char* name, int flags, int mode)\r
-{\r
-    return stub(ENOENT);\r
-}\r
-\r
-int _openat(int dirfd, const char* name, int flags, int mode)\r
-{\r
-    return stub(ENOENT);\r
-}\r
-\r
-int _close(int fd)\r
-{\r
-    return stub(EBADF);\r
-}\r
-\r
-int _execve(const char* name, char* const argv[], char* const env[])\r
-{\r
-    return stub(ENOMEM);\r
-}\r
-\r
-int _fork()\r
-{\r
-    return stub(EAGAIN);\r
-}\r
-\r
-int _fstat(int fd, struct stat *st)\r
-{\r
-    if (isatty(fd))\r
-    {\r
-        st->st_mode = S_IFCHR;\r
-        return 0;\r
-    }\r
-\r
-    return stub(EBADF);\r
-}\r
-\r
-int _getpid()\r
-{\r
-    return 1;\r
-}\r
-\r
-int _kill(int pid, int sig)\r
-{\r
-    return stub(EINVAL);\r
-}\r
-\r
-int _link(const char *old_name, const char *new_name)\r
-{\r
-    return stub(EMLINK);\r
-}\r
-\r
-off_t _lseek(int fd, off_t ptr, int dir)\r
-{\r
-    if (_isatty(fd))\r
-    {\r
-        return 0;\r
-    }\r
-\r
-    return stub(EBADF);\r
-}\r
-\r
-ssize_t _read(int fd, void* ptr, size_t len)\r
-{\r
-#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
-    if (_isatty(fd))\r
-    {\r
-        /*--------------------------------------------------------------------------\r
-        * Initialize the UART driver if it is the first time this function is\r
-        * called.\r
-        */\r
-        if ( !g_stdio_uart_init_done )\r
-        {\r
-            /******************************************************************************\r
-            * Baud value:\r
-            * This value is calculated using the following equation:\r
-            *      BAUD_VALUE = (CLOCK / (16 * BAUD_RATE)) - 1\r
-            *****************************************************************************/\r
-            UART_init( &g_stdio_uart, MSCC_STDIO_UART_BASE_ADDR, ((SYS_CLK_FREQ/(16 * MSCC_STDIO_BAUD_VALUE))-1), (DATA_8_BITS | NO_PARITY));\r
-            g_stdio_uart_init_done = 1;\r
-        }\r
-\r
-        return UART_get_rx(&g_stdio_uart, (uint8_t*) ptr, len);\r
-    }\r
-#endif\r
-\r
-    return stub(EBADF);\r
-}\r
-\r
-int _stat(const char* file, struct stat* st)\r
-{\r
-    return stub(EACCES);\r
-}\r
-\r
-clock_t _times(struct tms* buf)\r
-{\r
-    return stub(EACCES);\r
-}\r
-\r
-int _unlink(const char* name)\r
-{\r
-    return stub(ENOENT);\r
-}\r
-\r
-int _wait(int* status)\r
-{\r
-    return stub(ECHILD);\r
-}\r
-\r
-ssize_t _write(int fd, const void* ptr, size_t len)\r
-{\r
-\r
-#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
-  const uint8_t * current = (const uint8_t *) ptr;\r
-  size_t jj;\r
-\r
-  if (_isatty(fd))\r
-  {\r
-        /*--------------------------------------------------------------------------\r
-        * Initialize the UART driver if it is the first time this function is\r
-        * called.\r
-        */\r
-        if ( !g_stdio_uart_init_done )\r
-        {\r
-            /******************************************************************************\r
-            * Baud value:\r
-            * This value is calculated using the following equation:\r
-            *      BAUD_VALUE = (CLOCK / (16 * BAUD_RATE)) - 1\r
-            *****************************************************************************/\r
-            UART_init( &g_stdio_uart, MSCC_STDIO_UART_BASE_ADDR, ((SYS_CLK_FREQ/(16 * MSCC_STDIO_BAUD_VALUE))-1), (DATA_8_BITS | NO_PARITY));\r
-            g_stdio_uart_init_done = 1;\r
-        }\r
-\r
-    for (jj = 0; jj < len; jj++)\r
-    {\r
-        UART_send(&g_stdio_uart, current + jj, 1);\r
-        if (current[jj] == '\n')\r
-        {\r
-            UART_send(&g_stdio_uart, (const uint8_t *)"\r", 1);\r
-        }\r
-    }\r
-    return len;\r
-  }\r
-#endif\r
-\r
-  return stub(EBADF);\r
-}\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/RTOSDemo Debug Hardware.launch b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/RTOSDemo Debug Hardware.launch
deleted file mode 100644 (file)
index 64767a5..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<launchConfiguration type="ilg.gnumcueclipse.debug.gdbjtag.openocd.launchConfigurationType">\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doContinue" value="true"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doSecondReset" value="false"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbCLient" value="true"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set $target_riscv = 1&#13;&#10;set mem inaccessible-by-default off"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="${openocd_path}/${openocd_executable}"/>\r
-    <intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerOther" value="--file board/microsemi-riscv.cfg"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTclPortNumber" value="6666"/>\r
-    <intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.svdPath" value=""/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>\r
-    <intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>\r
-    <stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${cross_prefix}gdb${cross_suffix}"/>\r
-    <booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>\r
-    <intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>\r
-    <stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>\r
-    <stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>\r
-    <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug\RTOSDemo.elf"/>\r
-    <stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="RTOSDemo"/>\r
-    <booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>\r
-    <stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127"/>\r
-    <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">\r
-        <listEntry value="/RTOSDemo"/>\r
-    </listAttribute>\r
-    <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">\r
-        <listEntry value="4"/>\r
-    </listAttribute>\r
-    <stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;&gt;&#13;&#10;    &lt;memoryBlockExpression address=&quot;2147525816&quot; label=&quot;0x8000a4b8&quot;/&gt;&#13;&#10;&lt;/memoryBlockExpressionList&gt;&#13;&#10;"/>\r
-    <stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>\r
-</launchConfiguration>\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/RTOSDemo Debug Renode.launch b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/RTOSDemo Debug Renode.launch
deleted file mode 100644 (file)
index 78d0905..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<launchConfiguration type="ilg.gnumcueclipse.debug.gdbjtag.openocd.launchConfigurationType">\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doContinue" value="true"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doSecondReset" value="false"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbCLient" value="true"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbServer" value="false"/>\r
-    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set $target_riscv = 1&#13;&#10;set mem inaccessible-by-default off&#13;&#10;set arch riscv:rv32"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="${openocd_path}/${openocd_executable}"/>\r
-    <intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerOther" value="--file board/microsemi-riscv.cfg"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTclPortNumber" value="6666"/>\r
-    <intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>\r
-    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.svdPath" value=""/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>\r
-    <intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>\r
-    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>\r
-    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>\r
-    <stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${cross_prefix}gdb${cross_suffix}"/>\r
-    <booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>\r
-    <intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>\r
-    <stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>\r
-    <stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>\r
-    <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug\RTOSDemo.elf"/>\r
-    <stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="RTOSDemo"/>\r
-    <booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>\r
-    <stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127"/>\r
-    <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">\r
-        <listEntry value="/RTOSDemo"/>\r
-    </listAttribute>\r
-    <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">\r
-        <listEntry value="4"/>\r
-    </listAttribute>\r
-    <stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;&gt;&#13;&#10;    &lt;memoryBlockExpression address=&quot;2147525816&quot; label=&quot;0x8000a4b8&quot;/&gt;&#13;&#10;&lt;/memoryBlockExpressionList&gt;&#13;&#10;"/>\r
-    <stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>\r
-</launchConfiguration>\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/RTOSDemo Debug.launch b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/RTOSDemo Debug.launch
deleted file mode 100644 (file)
index 9bc0bf0..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<launchConfiguration type="ilg.gnumcueclipse.debug.gdbjtag.openocd.launchConfigurationType">\r
-<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doContinue" value="true"/>\r
-<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>\r
-<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>\r
-<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>\r
-<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>\r
-<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doSecondReset" value="false"/>\r
-<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/>\r
-<booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/>\r
-<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>\r
-<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set mem inaccessible-by-default off&#13;&#10;set arch riscv:rv32"/>\r
-<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>\r
-<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>\r
-<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="${openocd_path}/${openocd_executable}"/>\r
-<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>\r
-<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>\r
-<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerOther" value="--file board/microsemi-riscv.cfg"/>\r
-<intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>\r
-<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>\r
-<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>\r
-<stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>\r
-<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>\r
-<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>\r
-<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>\r
-<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD"/>\r
-<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>\r
-<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>\r
-<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>\r
-<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>\r
-<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>\r
-<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>\r
-<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>\r
-<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>\r
-<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>\r
-<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>\r
-<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>\r
-<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>\r
-<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>\r
-<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>\r
-<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>\r
-<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${cross_prefix}gdb${cross_suffix}"/>\r
-<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>\r
-<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>\r
-<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>\r
-<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>\r
-<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug\RTOSDemo.elf"/>\r
-<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="RTOSDemo"/>\r
-<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>\r
-<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127"/>\r
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">\r
-<listEntry value="/RTOSDemo"/>\r
-</listAttribute>\r
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">\r
-<listEntry value="4"/>\r
-</listAttribute>\r
-<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;/&gt;&#13;&#10;"/>\r
-<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>\r
-</launchConfiguration>\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/RTOSDemo-start-renode-emulator-and-attach.launch b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/RTOSDemo-start-renode-emulator-and-attach.launch
deleted file mode 100644 (file)
index 383dbed..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<launchConfiguration type="org.eclipse.debug.core.groups.GroupLaunchConfigurationType">\r
-    <stringAttribute key="org.eclipse.debug.core.launchGroup.0.action" value="OUTPUT_REGEXP"/>\r
-    <stringAttribute key="org.eclipse.debug.core.launchGroup.0.actionParam" value="Renode\ has\ been\ started\ successfully\ and\ is\ ready\ for\ a\ gdb\ connection"/>\r
-    <booleanAttribute key="org.eclipse.debug.core.launchGroup.0.adoptIfRunning" value="false"/>\r
-    <booleanAttribute key="org.eclipse.debug.core.launchGroup.0.enabled" value="true"/>\r
-    <stringAttribute key="org.eclipse.debug.core.launchGroup.0.mode" value="run"/>\r
-    <stringAttribute key="org.eclipse.debug.core.launchGroup.0.name" value="Mi-V-Renode-emulation-platform"/>\r
-    <stringAttribute key="org.eclipse.debug.core.launchGroup.1.action" value="NONE"/>\r
-    <booleanAttribute key="org.eclipse.debug.core.launchGroup.1.adoptIfRunning" value="false"/>\r
-    <booleanAttribute key="org.eclipse.debug.core.launchGroup.1.enabled" value="true"/>\r
-    <stringAttribute key="org.eclipse.debug.core.launchGroup.1.mode" value="inherit"/>\r
-    <stringAttribute key="org.eclipse.debug.core.launchGroup.1.name" value="RTOSDemo Debug Renode"/>\r
-</launchConfiguration>\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/blinky_demo/main_blinky.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/blinky_demo/main_blinky.c
deleted file mode 100644 (file)
index 7688ed8..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/*\r
- * FreeRTOS Kernel V10.1.1\r
- * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
- * this software and associated documentation files (the "Software"), to deal in\r
- * the Software without restriction, including without limitation the rights to\r
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
- * the Software, and to permit persons to whom the Software is furnished to do so,\r
- * subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included in all\r
- * copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- *\r
- * http://www.FreeRTOS.org\r
- * http://aws.amazon.com/freertos\r
- *\r
- * 1 tab == 4 spaces!\r
- */\r
-\r
-/******************************************************************************\r
- * NOTE 1:  This project provides two demo applications.  A simple blinky\r
- * style project, and a more comprehensive test and demo application.  The\r
- * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select\r
- * between the two.  See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\r
- * in main.c.  This file implements the simply blinky style version.\r
- *\r
- * NOTE 2:  This file only contains the source code that is specific to the\r
- * basic demo.  Generic functions, such FreeRTOS hook functions, and functions\r
- * required to configure the hardware are defined in main.c.\r
- ******************************************************************************\r
- *\r
- * main_blinky() creates one queue, and two tasks.  It then starts the\r
- * scheduler.\r
- *\r
- * The Queue Send Task:\r
- * The queue send task is implemented by the prvQueueSendTask() function in\r
- * this file.  prvQueueSendTask() sits in a loop that causes it to repeatedly\r
- * block for 1000 milliseconds, before sending the value 100 to the queue that\r
- * was created within main_blinky().  Once the value is sent, the task loops\r
- * back around to block for another 1000 milliseconds...and so on.\r
- *\r
- * The Queue Receive Task:\r
- * The queue receive task is implemented by the prvQueueReceiveTask() function\r
- * in this file.  prvQueueReceiveTask() sits in a loop where it repeatedly\r
- * blocks on attempts to read data from the queue that was created within\r
- * main_blinky().  When data is received, the task checks the value of the\r
- * data, and if the value equals the expected 100, writes 'Blink' to the UART\r
- * (the UART is used in place of the LED to allow easy execution in QEMU).  The\r
- * 'block time' parameter passed to the queue receive function specifies that\r
- * the task should be held in the Blocked state indefinitely to wait for data to\r
- * be available on the queue.  The queue receive task will only leave the\r
- * Blocked state when the queue send task writes to the queue.  As the queue\r
- * send task writes to the queue every 1000 milliseconds, the queue receive\r
- * task leaves the Blocked state every 1000 milliseconds, and therefore toggles\r
- * the LED every 200 milliseconds.\r
- */\r
-\r
-/* Standard includes. */\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include <unistd.h>\r
-\r
-/* Kernel includes. */\r
-#include "FreeRTOS.h"\r
-#include "task.h"\r
-#include "queue.h"\r
-\r
-/* Priorities used by the tasks. */\r
-#define mainQUEUE_RECEIVE_TASK_PRIORITY                ( tskIDLE_PRIORITY + 2 )\r
-#define        mainQUEUE_SEND_TASK_PRIORITY            ( tskIDLE_PRIORITY + 1 )\r
-\r
-/* The rate at which data is sent to the queue.  The 200ms value is converted\r
-to ticks using the pdMS_TO_TICKS() macro. */\r
-#define mainQUEUE_SEND_FREQUENCY_MS                    pdMS_TO_TICKS( 1000 )\r
-\r
-/* The maximum number items the queue can hold.  The priority of the receiving\r
-task is above the priority of the sending task, so the receiving task will\r
-preempt the sending task and remove the queue items each time the sending task\r
-writes to the queue.  Therefore the queue will never have more than one item in\r
-it at any time, and even with a queue length of 1, the sending task will never\r
-find the queue full. */\r
-#define mainQUEUE_LENGTH                                       ( 1 )\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-/*\r
- * Called by main when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1 in\r
- * main.c.\r
- */\r
-void main_blinky( void );\r
-\r
-/*\r
- * The tasks as described in the comments at the top of this file.\r
- */\r
-static void prvQueueReceiveTask( void *pvParameters );\r
-static void prvQueueSendTask( void *pvParameters );\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-/* The queue used by both tasks. */\r
-static QueueHandle_t xQueue = NULL;\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-void main_blinky( void )\r
-{\r
-       /* Create the queue. */\r
-       xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) );\r
-\r
-       if( xQueue != NULL )\r
-       {\r
-               /* Start the two tasks as described in the comments at the top of this\r
-               file. */\r
-               xTaskCreate( prvQueueReceiveTask,                               /* The function that implements the task. */\r
-                                       "Rx",                                                           /* The text name assigned to the task - for debug only as it is not used by the kernel. */\r
-                                       configMINIMAL_STACK_SIZE * 2U,                  /* The size of the stack to allocate to the task. */\r
-                                       NULL,                                                           /* The parameter passed to the task - not used in this case. */\r
-                                       mainQUEUE_RECEIVE_TASK_PRIORITY,        /* The priority assigned to the task. */\r
-                                       NULL );                                                         /* The task handle is not required, so NULL is passed. */\r
-\r
-               xTaskCreate( prvQueueSendTask, "TX", configMINIMAL_STACK_SIZE * 2U, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL );\r
-\r
-               /* Start the tasks and timer running. */\r
-               vTaskStartScheduler();\r
-       }\r
-\r
-       /* If all is well, the scheduler will now be running, and the following\r
-       line will never be reached.  If the following line does execute, then\r
-       there was insufficient FreeRTOS heap memory available for the Idle and/or\r
-       timer tasks to be created.  See the memory management section on the\r
-       FreeRTOS web site for more details on the FreeRTOS heap\r
-       http://www.freertos.org/a00111.html. */\r
-       for( ;; );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-static void prvQueueSendTask( void *pvParameters )\r
-{\r
-TickType_t xNextWakeTime;\r
-const unsigned long ulValueToSend = 100UL;\r
-BaseType_t xReturned;\r
-\r
-       /* Remove compiler warning about unused parameter. */\r
-       ( void ) pvParameters;\r
-\r
-       /* Initialise xNextWakeTime - this only needs to be done once. */\r
-       xNextWakeTime = xTaskGetTickCount();\r
-\r
-       for( ;; )\r
-       {\r
-               /* Place this task in the blocked state until it is time to run again. */\r
-               vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );\r
-\r
-               /* Send to the queue - causing the queue receive task to unblock and\r
-               toggle the LED.  0 is used as the block time so the sending operation\r
-               will not block - it shouldn't need to block as the queue should always\r
-               be empty at this point in the code. */\r
-               xReturned = xQueueSend( xQueue, &ulValueToSend, 0U );\r
-               configASSERT( xReturned == pdPASS );\r
-       }\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-static void prvQueueReceiveTask( void *pvParameters )\r
-{\r
-unsigned long ulReceivedValue;\r
-const unsigned long ulExpectedValue = 100UL;\r
-const char * const pcPassMessage = "Blink\r\n";\r
-const char * const pcFailMessage = "Unexpected value received\r\n";\r
-extern void vSendString( const char * const pcString );\r
-extern void vToggleLED( void );\r
-\r
-       /* Remove compiler warning about unused parameter. */\r
-       ( void ) pvParameters;\r
-\r
-       for( ;; )\r
-       {\r
-               /* Wait until something arrives in the queue - this task will block\r
-               indefinitely provided INCLUDE_vTaskSuspend is set to 1 in\r
-               FreeRTOSConfig.h. */\r
-               xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );\r
-\r
-               /*  To get here something must have been received from the queue, but\r
-               is it the expected value?  If it is, toggle the LED. */\r
-               if( ulReceivedValue == ulExpectedValue )\r
-               {\r
-                       vSendString( pcPassMessage );\r
-                       vToggleLED();\r
-                       ulReceivedValue = 0U;\r
-               }\r
-               else\r
-               {\r
-                       vSendString( pcFailMessage );\r
-               }\r
-       }\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/RegTest.S b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/RegTest.S
deleted file mode 100644 (file)
index 702454f..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-/*\r
- * FreeRTOS Kernel V10.1.1\r
- * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
- * this software and associated documentation files (the "Software"), to deal in\r
- * the Software without restriction, including without limitation the rights to\r
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
- * the Software, and to permit persons to whom the Software is furnished to do so,\r
- * subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included in all\r
- * copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- *\r
- * http://www.FreeRTOS.org\r
- * http://aws.amazon.com/freertos\r
- *\r
- * 1 tab == 4 spaces!\r
- */\r
-\r
-       .extern ulRegTest1LoopCounter\r
-       .extern ulRegTest2LoopCounter\r
-\r
-       .global vRegTest1Implementation\r
-       .global vRegTest2Implementation\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-/*\r
- * The register check tasks are described in the comments at the top of\r
- * main_full.c.\r
- */\r
-\r
-vRegTest1Implementation:\r
-\r
-       /* Fill the core registers with known values. */\r
-       li x5, 0x5\r
-       li x6, 0x6\r
-       li x7, 0x7\r
-       li x8, 0x8\r
-       li x9, 0x9\r
-       li x10, 0xa\r
-       li x11, 0xb\r
-       li x12, 0xc\r
-       li x13, 0xd\r
-       li x14, 0xe\r
-       li x15, 0xf\r
-       li x16, 0x10\r
-       li x17, 0x11\r
-       li x18, 0x12\r
-       li x19, 0x13\r
-       li x20, 0x14\r
-       li x21, 0x15\r
-       li x22, 0x16\r
-       li x23, 0x17\r
-       li x24, 0x18\r
-       li x25, 0x19\r
-       li x26, 0x1a\r
-       li x27, 0x1b\r
-       li x28, 0x1c\r
-       li x29, 0x1d\r
-       li x30, 0x1e\r
-\r
-reg1_loop:\r
-\r
-       /* Check each register still contains the expected known value.\r
-       vRegTest1Implementation uses x31 as the temporary, vRegTest2Implementation\r
-       uses x5 as the temporary. */\r
-       li x31, 0x5\r
-       bne x31, x5, reg1_error_loop\r
-       li x31, 0x6\r
-       bne x31, x6, reg1_error_loop\r
-       li x31, 0x7\r
-       bne x31, x7, reg1_error_loop\r
-       li x31, 0x8\r
-       bne x31, x8, reg1_error_loop\r
-       li x31, 0x9\r
-       bne x31, x9, reg1_error_loop\r
-       li x31, 0xa\r
-       bne x31, x10, reg1_error_loop\r
-       li x31, 0xb\r
-       bne x31, x11, reg1_error_loop\r
-       li x31, 0xc\r
-       bne x31, x12, reg1_error_loop\r
-       li x31, 0xd\r
-       bne x31, x13, reg1_error_loop\r
-       li x31, 0xe\r
-       bne x31, x14, reg1_error_loop\r
-       li x31, 0xf\r
-       bne x31, x15, reg1_error_loop\r
-       li x31, 0x10\r
-       bne x31, x16, reg1_error_loop\r
-       li x31, 0x11\r
-       bne x31, x17, reg1_error_loop\r
-       li x31, 0x12\r
-       bne x31, x18, reg1_error_loop\r
-       li x31, 0x13\r
-       bne x31, x19, reg1_error_loop\r
-       li x31, 0x14\r
-       bne x31, x20, reg1_error_loop\r
-       li x31, 0x15\r
-       bne x31, x21, reg1_error_loop\r
-       li x31, 0x16\r
-       bne x31, x22, reg1_error_loop\r
-       li x31, 0x17\r
-       bne x31, x23, reg1_error_loop\r
-       li x31, 0x18\r
-       bne x31, x24, reg1_error_loop\r
-       li x31, 0x19\r
-       bne x31, x25, reg1_error_loop\r
-       li x31, 0x1a\r
-       bne x31, x26, reg1_error_loop\r
-       li x31, 0x1b\r
-       bne x31, x27, reg1_error_loop\r
-       li x31, 0x1c\r
-       bne x31, x28, reg1_error_loop\r
-       li x31, 0x1d\r
-       bne x31, x29, reg1_error_loop\r
-       li x31, 0x1e\r
-       bne x31, x30, reg1_error_loop\r
-\r
-       /* Everything passed, increment the loop counter. */\r
-       lw x31, ulRegTest1LoopCounterConst\r
-       lw x30, 0(x31)\r
-       addi x30, x30, 1\r
-       sw x30, 0(x31)\r
-\r
-       /* Restore clobbered register reading for next loop. */\r
-       li x30, 0x1e\r
-\r
-       /* Yield to increase code coverage. */\r
-       ecall\r
-\r
-       /* Start again. */\r
-       jal reg1_loop\r
-\r
-reg1_error_loop:\r
-       /* Jump here if a register contains an uxpected value.  This stops the loop\r
-       counter being incremented so the check task knows an error was found. */\r
-       jal reg1_error_loop\r
-\r
-ulRegTest1LoopCounterConst: .word ulRegTest1LoopCounter\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-vRegTest2Implementation:\r
-\r
-       /* Fill the core registers with known values. */\r
-       li x6, 0x61\r
-       li x7, 0x71\r
-       li x8, 0x81\r
-       li x9, 0x91\r
-       li x10, 0xa1\r
-       li x11, 0xb1\r
-       li x12, 0xc1\r
-       li x13, 0xd1\r
-       li x14, 0xe1\r
-       li x15, 0xf1\r
-       li x16, 0x20\r
-       li x17, 0x21\r
-       li x18, 0x22\r
-       li x19, 0x23\r
-       li x20, 0x24\r
-       li x21, 0x25\r
-       li x22, 0x26\r
-       li x23, 0x27\r
-       li x24, 0x28\r
-       li x25, 0x29\r
-       li x26, 0x2a\r
-       li x27, 0x2b\r
-       li x28, 0x2c\r
-       li x29, 0x2d\r
-       li x30, 0x2e\r
-       li x31, 0x2f\r
-\r
-Reg2_loop:\r
-\r
-       /* Check each register still contains the expected known value.\r
-       vRegTest2Implementation uses x5 as the temporary, vRegTest1Implementation\r
-       uses x31 as the temporary. */\r
-       li x5, 0x61\r
-       bne x5, x6, reg2_error_loop\r
-       li x5, 0x71\r
-       bne x5, x7, reg2_error_loop\r
-       li x5, 0x81\r
-       bne x5, x8, reg2_error_loop\r
-       li x5, 0x91\r
-       bne x5, x9, reg2_error_loop\r
-       li x5, 0xa1\r
-       bne x5, x10, reg2_error_loop\r
-       li x5, 0xb1\r
-       bne x5, x11, reg2_error_loop\r
-       li x5, 0xc1\r
-       bne x5, x12, reg2_error_loop\r
-       li x5, 0xd1\r
-       bne x5, x13, reg2_error_loop\r
-       li x5, 0xe1\r
-       bne x5, x14, reg2_error_loop\r
-       li x5, 0xf1\r
-       bne x5, x15, reg2_error_loop\r
-       li x5, 0x20\r
-       bne x5, x16, reg2_error_loop\r
-       li x5, 0x21\r
-       bne x5, x17, reg2_error_loop\r
-       li x5, 0x22\r
-       bne x5, x18, reg2_error_loop\r
-       li x5, 0x23\r
-       bne x5, x19, reg2_error_loop\r
-       li x5, 0x24\r
-       bne x5, x20, reg2_error_loop\r
-       li x5, 0x25\r
-       bne x5, x21, reg2_error_loop\r
-       li x5, 0x26\r
-       bne x5, x22, reg2_error_loop\r
-       li x5, 0x27\r
-       bne x5, x23, reg2_error_loop\r
-       li x5, 0x28\r
-       bne x5, x24, reg2_error_loop\r
-       li x5, 0x29\r
-       bne x5, x25, reg2_error_loop\r
-       li x5, 0x2a\r
-       bne x5, x26, reg2_error_loop\r
-       li x5, 0x2b\r
-       bne x5, x27, reg2_error_loop\r
-       li x5, 0x2c\r
-       bne x5, x28, reg2_error_loop\r
-       li x5, 0x2d\r
-       bne x5, x29, reg2_error_loop\r
-       li x5, 0x2e\r
-       bne x5, x30, reg2_error_loop\r
-       li x5, 0x2f\r
-       bne x5, x31, reg2_error_loop\r
-\r
-       /* Everything passed, increment the loop counter. */\r
-       lw x5, ulRegTest2LoopCounterConst\r
-       lw x6, 0(x5)\r
-       addi x6, x6, 1\r
-       sw x6, 0(x5)\r
-\r
-       /* Restore clobbered register reading for next loop. */\r
-       li x6, 0x61\r
-\r
-       /* Start again. */\r
-       jal Reg2_loop\r
-\r
-reg2_error_loop:\r
-       /* Jump here if a register contains an uxpected value.  This stops the loop\r
-       counter being incremented so the check task knows an error was found. */\r
-       jal reg2_error_loop\r
-\r
-ulRegTest2LoopCounterConst: .word ulRegTest2LoopCounter\r
-\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/main_full.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/main_full.c
deleted file mode 100644 (file)
index f86b8c6..0000000
+++ /dev/null
@@ -1,475 +0,0 @@
-/*\r
- * FreeRTOS Kernel V10.1.1\r
- * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
- * this software and associated documentation files (the "Software"), to deal in\r
- * the Software without restriction, including without limitation the rights to\r
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
- * the Software, and to permit persons to whom the Software is furnished to do so,\r
- * subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included in all\r
- * copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- *\r
- * http://www.FreeRTOS.org\r
- * http://aws.amazon.com/freertos\r
- *\r
- * 1 tab == 4 spaces!\r
- */\r
-\r
-/******************************************************************************\r
- * NOTE 1:  This project provides two demo applications.  A simple blinky style\r
- * project, and a more comprehensive test and demo application.  The\r
- * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select\r
- * between the two.  See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\r
- * in main.c.  This file implements the comprehensive test and demo version.\r
- *\r
- * NOTE 2:  This file only contains the source code that is specific to the\r
- * full demo.  Generic functions, such FreeRTOS hook functions, and functions\r
- * required to configure the hardware, are defined in main.c.\r
- *\r
- ******************************************************************************\r
- *\r
- * main_full() creates all the demo application tasks and software timers, then\r
- * starts the scheduler.  The web documentation provides more details of the\r
- * standard demo application tasks, which provide no particular functionality,\r
- * but do provide a good example of how to use the FreeRTOS API.\r
- *\r
- * In addition to the standard demo tasks, the following tasks and tests are\r
- * defined and/or created within this file:\r
- *\r
- * "Reg test" tasks - These fill both the core registers with known values, then\r
- * check that each register maintains its expected value for the lifetime of the\r
- * task.  Each task uses a different set of values.  The reg test tasks execute\r
- * with a very low priority, so get preempted very frequently.  A register\r
- * containing an unexpected value is indicative of an error in the context\r
- * switching mechanism.\r
- *\r
- * "Check" task - The check executes every three seconds.  It checks that all\r
- * the standard demo tasks, and the register check tasks, are not only still\r
- * executing, but are executing without reporting any errors.  If the check task\r
- * discovers that a task has either stalled, or reported an error, then it\r
- * prints an error message to the UART, otherwise it prints "Pass.".\r
- */\r
-\r
-/* Standard includes. */\r
-#include <stdio.h>\r
-#include <string.h>\r
-\r
-/* Kernel includes. */\r
-#include "FreeRTOS.h"\r
-#include "task.h"\r
-#include "timers.h"\r
-#include "semphr.h"\r
-\r
-/* Microsemi incldues. */\r
-#include "core_timer.h"\r
-#include "riscv_hal.h"\r
-\r
-/* Standard demo application includes. */\r
-#include "dynamic.h"\r
-#include "blocktim.h"\r
-#include "GenQTest.h"\r
-#include "recmutex.h"\r
-#include "TimerDemo.h"\r
-#include "EventGroupsDemo.h"\r
-#include "TaskNotify.h"\r
-#include "AbortDelay.h"\r
-#include "countsem.h"\r
-#include "death.h"\r
-#include "MessageBufferDemo.h"\r
-#include "StreamBufferDemo.h"\r
-#include "StreamBufferInterrupt.h"\r
-\r
-/* Priorities for the demo application tasks. */\r
-#define mainCHECK_TASK_PRIORITY                                ( configMAX_PRIORITIES - 1 )\r
-#define mainCREATOR_TASK_PRIORITY                      ( tskIDLE_PRIORITY + 3UL )\r
-\r
-/* The period of the check task, in ms, converted to ticks using the\r
-pdMS_TO_TICKS() macro.  mainNO_ERROR_CHECK_TASK_PERIOD is used if no errors have\r
-been found, mainERROR_CHECK_TASK_PERIOD is used if an error has been found. */\r
-#define mainNO_ERROR_CHECK_TASK_PERIOD         pdMS_TO_TICKS( 3000UL )\r
-#define mainERROR_CHECK_TASK_PERIOD            pdMS_TO_TICKS( 500UL )\r
-\r
-/* Parameters that are passed into the register check tasks solely for the\r
-purpose of ensuring parameters are passed into tasks correctly. */\r
-#define mainREG_TEST_TASK_1_PARAMETER          ( ( void * ) 0x12345678 )\r
-#define mainREG_TEST_TASK_2_PARAMETER          ( ( void * ) 0x87654321 )\r
-\r
-/* The base period used by the timer test tasks. */\r
-#define mainTIMER_TEST_PERIOD                          ( 50 )\r
-\r
-/* The size of the stack allocated to the check task (as described in the\r
-comments at the top of this file. */\r
-#define mainCHECK_TASK_STACK_SIZE_WORDS 100\r
-\r
-/* Size of the stacks to allocated for the register check tasks. */\r
-#define mainREG_TEST_STACK_SIZE_WORDS 70\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-/*\r
- * Called by main() to run the full demo (as opposed to the blinky demo) when\r
- * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.\r
- */\r
-void main_full( void );\r
-\r
-/*\r
- * The check task, as described at the top of this file.\r
- */\r
-static void prvCheckTask( void *pvParameters );\r
-\r
-/*\r
- * Initialise and start the peripheral timers that are used to exercise external\r
- * interrupt processing.\r
- */\r
-static void prvSetupPeripheralTimers( void );\r
-\r
-/*\r
- * Register check tasks as described at the top of this file.  The nature of\r
- * these files necessitates that they are written in an assembly file, but the\r
- * entry points are kept in the C file for the convenience of checking the task\r
- * parameter.\r
- */\r
-static void prvRegTestTaskEntry1( void *pvParameters );\r
-extern void vRegTest1Implementation( void );\r
-static void prvRegTestTaskEntry2( void *pvParameters );\r
-extern void vRegTest2Implementation( void );\r
-\r
-/*\r
- * Tick hook used by the full demo, which includes code that interacts with\r
- * some of the tests.\r
- */\r
-void vFullDemoTickHook( void );\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-/* Timers used to exercise external interrupt processing. */\r
-static timer_instance_t g_timer0, g_timer1;\r
-\r
-/* Variables incremented by the peripheral timers used to exercise external\r
-interrupts. */\r
-volatile uint32_t ulTimer0Interrupts = 0, ulTimer1Interrupts = 0;\r
-\r
-/* The following two variables are used to communicate the status of the\r
-register check tasks to the check task.  If the variables keep incrementing,\r
-then the register check tasks have not discovered any errors.  If a variable\r
-stops incrementing, then an error has been found. */\r
-volatile uint32_t ulRegTest1LoopCounter = 0UL, ulRegTest2LoopCounter = 0UL;\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-void main_full( void )\r
-{\r
-       /* Start all the other standard demo/test tasks.  They have no particular\r
-       functionality, but do demonstrate how to use the FreeRTOS API and test the\r
-       kernel port. */\r
-       vStartDynamicPriorityTasks();\r
-       vCreateBlockTimeTasks();\r
-       vStartGenericQueueTasks( tskIDLE_PRIORITY );\r
-       vStartRecursiveMutexTasks();\r
-       vStartTimerDemoTask( mainTIMER_TEST_PERIOD );\r
-       vStartEventGroupTasks();\r
-       vStartTaskNotifyTask();\r
-       vCreateAbortDelayTasks();\r
-       vStartCountingSemaphoreTasks();\r
-       vStartMessageBufferTasks( configMINIMAL_STACK_SIZE  );\r
-       vStartStreamBufferTasks();\r
-       vStartStreamBufferInterruptDemo();\r
-\r
-       /* Create the register check tasks, as described at the top of this     file.\r
-       Use xTaskCreateStatic() to create a task using only statically allocated\r
-       memory. */\r
-       xTaskCreate( prvRegTestTaskEntry1,                      /* The function that implements the task. */\r
-                                "Reg1",                                                /* The name of the task. */\r
-                                mainREG_TEST_STACK_SIZE_WORDS, /* Size of stack to allocate for the task - in words not bytes!. */\r
-                                mainREG_TEST_TASK_1_PARAMETER, /* Parameter passed into the task. */\r
-                                tskIDLE_PRIORITY,                              /* Priority of the task. */\r
-                                NULL );                                                /* Can be used to pass out a handle to the created task. */\r
-       xTaskCreate( prvRegTestTaskEntry2, "Reg2", mainREG_TEST_STACK_SIZE_WORDS, mainREG_TEST_TASK_2_PARAMETER, tskIDLE_PRIORITY, NULL );\r
-\r
-       /* Create the task that performs the 'check' functionality,     as described at\r
-       the top of this file. */\r
-       xTaskCreate( prvCheckTask, "Check", mainCHECK_TASK_STACK_SIZE_WORDS, NULL, mainCHECK_TASK_PRIORITY, NULL );\r
-\r
-       /* The set of tasks created by the following function call have to be\r
-       created last as they keep account of the number of tasks they expect to see\r
-       running. */\r
-       vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY );\r
-\r
-       /* Start the timers that are used to exercise external interrupt handling. */\r
-       prvSetupPeripheralTimers();\r
-\r
-       /* Start the scheduler. */\r
-       vTaskStartScheduler();\r
-\r
-       /* If all is well, the scheduler will now be running, and the following\r
-       line will never be reached.  If the following line does execute, then\r
-       there was insufficient FreeRTOS heap memory available for the Idle and/or\r
-       timer tasks to be created.  See the memory management section on the\r
-       FreeRTOS web site for more details on the FreeRTOS heap\r
-       http://www.freertos.org/a00111.html. */\r
-       for( ;; );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-static void prvCheckTask( void *pvParameters )\r
-{\r
-TickType_t xDelayPeriod = mainNO_ERROR_CHECK_TASK_PERIOD;\r
-TickType_t xLastExecutionTime;\r
-uint32_t ulLastRegTest1Value = 0, ulLastRegTest2Value = 0;\r
-uint32_t ulLastTimer0Interrupts = 0, ulLastTimer1Interrupts = 0;\r
-char * const pcPassMessage = "Pass.\r\n";\r
-char * pcStatusMessage = pcPassMessage;\r
-extern void vSendString( const char * const pcString );\r
-extern void vToggleLED( void );\r
-\r
-       /* Just to stop compiler warnings. */\r
-       ( void ) pvParameters;\r
-\r
-       /* Initialise xLastExecutionTime so the first call to vTaskDelayUntil()\r
-       works correctly. */\r
-       xLastExecutionTime = xTaskGetTickCount();\r
-\r
-       /* Cycle for ever, delaying then checking all the other tasks are still\r
-       operating without error.  The onboard LED is toggled on each iteration.\r
-       If an error is detected then the delay period is decreased from\r
-       mainNO_ERROR_CHECK_TASK_PERIOD to mainERROR_CHECK_TASK_PERIOD.  This has the\r
-       effect of increasing the rate at which the onboard LED toggles, and in so\r
-       doing gives visual feedback of the system status. */\r
-       for( ;; )\r
-       {\r
-               /* Delay until it is time to execute again. */\r
-               vTaskDelayUntil( &xLastExecutionTime, xDelayPeriod );\r
-\r
-               /* Check all the demo tasks (other than the flash tasks) to ensure\r
-               that they are all still running, and that none have detected an error. */\r
-               if( xAreDynamicPriorityTasksStillRunning() == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Dynamic priority demo/tests.\r\n";\r
-               }\r
-\r
-               if ( xAreBlockTimeTestTasksStillRunning() == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Block time demo/tests.\r\n";\r
-               }\r
-\r
-               if ( xAreGenericQueueTasksStillRunning() == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Generic queue demo/tests.\r\n";\r
-               }\r
-\r
-               if ( xAreRecursiveMutexTasksStillRunning() == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Recursive mutex demo/tests.\r\n";\r
-               }\r
-\r
-               if( xAreTimerDemoTasksStillRunning( ( TickType_t ) xDelayPeriod ) == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Timer demo/tests.\r\n";\r
-               }\r
-\r
-               if( xAreEventGroupTasksStillRunning() == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Event group demo/tests.\r\n";\r
-               }\r
-\r
-               if( xAreTaskNotificationTasksStillRunning() == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Task notification demo/tests.\r\n";\r
-               }\r
-\r
-               if( xAreAbortDelayTestTasksStillRunning() == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Abort delay.\r\n";\r
-               }\r
-\r
-               if( xAreCountingSemaphoreTasksStillRunning() == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Counting semaphores.\r\n";\r
-               }\r
-\r
-               if( xIsCreateTaskStillRunning() == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Suicide tasks.\r\n";\r
-               }\r
-\r
-               if( xAreMessageBufferTasksStillRunning() == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Message buffer.\r\n";\r
-               }\r
-\r
-               if( xAreStreamBufferTasksStillRunning() == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Stream buffer.\r\n";\r
-               }\r
-\r
-               if( xIsInterruptStreamBufferDemoStillRunning() == pdFALSE )\r
-               {\r
-                       pcStatusMessage = "ERROR: Stream buffer interrupt.\r\n";\r
-               }\r
-\r
-               /* Check that the register test 1 task is still running. */\r
-               if( ulLastRegTest1Value == ulRegTest1LoopCounter )\r
-               {\r
-                       pcStatusMessage = "ERROR: Register test 1.\r\n";\r
-               }\r
-               ulLastRegTest1Value = ulRegTest1LoopCounter;\r
-\r
-               /* Check that the register test 2 task is still running. */\r
-               if( ulLastRegTest2Value == ulRegTest2LoopCounter )\r
-               {\r
-                       pcStatusMessage = "ERROR: Register test 2.\r\n";\r
-               }\r
-               ulLastRegTest2Value = ulRegTest2LoopCounter;\r
-\r
-               /* Check interrupts from the peripheral timers are being handled. */\r
-               if( ulLastTimer0Interrupts == ulTimer0Interrupts )\r
-               {\r
-                       pcStatusMessage = "ERROR: Peripheral timer 0.\r\n";\r
-               }\r
-               ulLastTimer0Interrupts = ulTimer0Interrupts;\r
-\r
-               if( ulLastTimer1Interrupts == ulTimer1Interrupts )\r
-               {\r
-                       pcStatusMessage = "ERROR: Peripheral timer 1.\r\n";\r
-               }\r
-               ulLastTimer1Interrupts = ulTimer1Interrupts;\r
-\r
-               /* Write the status message to the UART. */\r
-               vSendString( pcStatusMessage );\r
-\r
-               /* If an error has been found then increase the LED toggle rate by\r
-               increasing the cycle frequency. */\r
-               if( pcStatusMessage != pcPassMessage )\r
-               {\r
-                       xDelayPeriod = mainERROR_CHECK_TASK_PERIOD;\r
-               }\r
-       }\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-static void prvRegTestTaskEntry1( void *pvParameters )\r
-{\r
-       /* Although the regtest task is written in assembler, its entry point is\r
-       written in C for convenience of checking the task parameter is being passed\r
-       in correctly. */\r
-       if( pvParameters == mainREG_TEST_TASK_1_PARAMETER )\r
-       {\r
-               /* Start the part of the test that is written in assembler. */\r
-               vRegTest1Implementation();\r
-       }\r
-\r
-       /* The following line will only execute if the task parameter is found to\r
-       be incorrect.  The check task will detect that the regtest loop counter is\r
-       not being incremented and flag an error. */\r
-       vTaskDelete( NULL );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-static void prvRegTestTaskEntry2( void *pvParameters )\r
-{\r
-       /* Although the regtest task is written in assembler, its entry point is\r
-       written in C for convenience of checking the task parameter is being passed\r
-       in correctly. */\r
-       if( pvParameters == mainREG_TEST_TASK_2_PARAMETER )\r
-       {\r
-               /* Start the part of the test that is written in assembler. */\r
-               vRegTest2Implementation();\r
-       }\r
-\r
-       /* The following line will only execute if the task parameter is found to\r
-       be incorrect.  The check task will detect that the regtest loop counter is\r
-       not being incremented and flag an error. */\r
-       vTaskDelete( NULL );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vFullDemoTickHook( void )\r
-{\r
-       /* The full demo includes a software timer demo/test that requires\r
-       prodding periodically from the tick interrupt. */\r
-       vTimerPeriodicISRTests();\r
-\r
-       /* Call the periodic event group from ISR demo. */\r
-       vPeriodicEventGroupsProcessing();\r
-\r
-       /* Use task notifications from an interrupt. */\r
-       xNotifyTaskFromISR();\r
-\r
-       /* Writes to stream buffer byte by byte to test the stream buffer trigger\r
-       level functionality. */\r
-       vPeriodicStreamBufferProcessing();\r
-\r
-       /* Writes a string to a string buffer four bytes at a time to demonstrate\r
-       a stream being sent from an interrupt to a task. */\r
-       vBasicStreamBufferSendFromISR();\r
-\r
-       /* Called from vApplicationTickHook() when the project is configured to\r
-       build the full test/demo applications. */\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-static void prvSetupPeripheralTimers( void )\r
-{\r
-       TMR_init(       &g_timer0,\r
-                               CORETIMER0_BASE_ADDR,\r
-                               TMR_CONTINUOUS_MODE,\r
-                               PRESCALER_DIV_1024,\r
-                               83000 );\r
-\r
-    TMR_init(  &g_timer1,\r
-                               CORETIMER1_BASE_ADDR,\r
-                               TMR_CONTINUOUS_MODE,\r
-                               PRESCALER_DIV_512,\r
-                               42000 );\r
-\r
-       /* In this version of the PLIC, the priorities are fixed at 1.\r
-       Lower numbered devices have higher priorities. But this code is given as\r
-       an example.\r
-       */\r
-       PLIC_SetPriority( External_30_IRQn, 1 );\r
-       PLIC_SetPriority( External_31_IRQn, 1 );\r
-\r
-       /*Enable Timer 1 & 0 Interrupt*/\r
-       PLIC_EnableIRQ( External_30_IRQn );\r
-       PLIC_EnableIRQ( External_31_IRQn );\r
-\r
-       /* Enable the timers */\r
-       TMR_enable_int( &g_timer0 );\r
-       TMR_enable_int( &g_timer1 );\r
-\r
-       /* Make sure timers don't interrupt until the scheduler is running. */\r
-       portDISABLE_INTERRUPTS();\r
-\r
-       /*Start the timer*/\r
-       TMR_start( &g_timer0 );\r
-       TMR_start( &g_timer1 );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-/*Core Timer 0 Interrupt Handler*/\r
-uint8_t External_30_IRQHandler( void )\r
-{\r
-       ulTimer0Interrupts++;\r
-    TMR_clear_int(&g_timer0);\r
-    return( EXT_IRQ_KEEP_ENABLED );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-/*Core Timer 1 Interrupt Handler*/\r
-uint8_t External_31_IRQHandler( void )\r
-{\r
-       ulTimer1Interrupts++;\r
-    TMR_clear_int(&g_timer1);\r
-\r
-    return( EXT_IRQ_KEEP_ENABLED );\r
-}\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/hw_platform.h b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/hw_platform.h
deleted file mode 100644 (file)
index b56f103..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************\r
- * (c) Copyright 2016-2017 Microsemi Corporation.  All rights reserved.\r
- *\r
- * Platform definitions\r
- * Version based on requirements of RISCV-HAL\r
- *\r
- * SVN $Revision: 9587 $\r
- * SVN $Date: 2017-11-16 12:53:31 +0530 (Thu, 16 Nov 2017) $\r
- */\r
- /*=========================================================================*//**\r
-  @mainpage Sample file detailing how hw_platform.h should be constructed for \r
-    the Mi-V processors.\r
-\r
-    @section intro_sec Introduction\r
-    The hw_platform.h is to be located in the project root directory.\r
-    Currently this file must be hand crafted when using the Mi-V Soft Processor.\r
-    \r
-    You can use this file as sample.\r
-    Rename this file from sample_hw_platform.h to hw_platform.h and store it in\r
-    the root folder of your project. Then customize it per your HW design.\r
-\r
-    @section driver_configuration Project configuration Instructions\r
-    1. Change SYS_CLK_FREQ define to frequency of Mi-V Soft processor clock\r
-    2  Add all other core BASE addresses\r
-    3. Add peripheral Core Interrupt to Mi-V Soft processor interrupt mappings\r
-    4. Define MSCC_STDIO_UART_BASE_ADDR if you want a CoreUARTapb mapped to STDIO\r
-*//*=========================================================================*/\r
-\r
-#ifndef HW_PLATFORM_H\r
-#define HW_PLATFORM_H\r
-\r
-/***************************************************************************//**\r
- * Soft-processor clock definition\r
- * This is the only clock brought over from the Mi-V Soft processor Libero design.\r
- */\r
-#ifndef SYS_CLK_FREQ\r
-#define SYS_CLK_FREQ                    70000000UL\r
-#endif\r
-\r
-/***************************************************************************//**\r
- * Non-memory Peripheral base addresses\r
- * Format of define is:\r
- * <corename>_<instance>_BASE_ADDR\r
- */\r
-#define COREUARTAPB0_BASE_ADDR          0x70001000UL\r
-#define COREGPIO_IN_BASE_ADDR           0x70002000UL\r
-#define CORETIMER0_BASE_ADDR            0x70003000UL\r
-#define CORETIMER1_BASE_ADDR            0x70004000UL\r
-#define COREGPIO_OUT_BASE_ADDR          0x70005000UL\r
-#define FLASH_CORE_SPI_BASE             0x70006000UL\r
-#define CORE16550_BASE_ADDR             0x70007000UL\r
-\r
-/***************************************************************************//**\r
- * Peripheral Interrupts are mapped to the corresponding Mi-V Soft processor\r
- * interrupt from the Libero design.\r
- * There can be up to 31 external interrupts (IRQ[30:0] pins) on the Mi-V Soft\r
- * processor.The Mi-V Soft processor external interrupts are defined in the\r
- * riscv_plic.h\r
- * These are of the form\r
- * typedef enum\r
-{\r
-    NoInterrupt_IRQn = 0,\r
-    External_1_IRQn  = 1,\r
-    External_2_IRQn  = 2,\r
-    .\r
-    .\r
-    .\r
-    External_31_IRQn = 31\r
-} IRQn_Type;\r
\r
- The interrupt 0 on RISC-V processor is not used. The pin IRQ[0] should map to\r
- External_1_IRQn likewise IRQ[30] should map to External_31_IRQn\r
- * Format of define is:\r
- * <corename>_<instance>_<core interrupt name>\r
- */\r
-\r
-#define TIMER0_IRQn                     External_30_IRQn\r
-#define TIMER1_IRQn                     External_31_IRQn\r
-\r
-/****************************************************************************\r
- * Baud value to achieve a 115200 baud rate with a 83MHz system clock.\r
- * This value is calculated using the following equation:\r
- *      BAUD_VALUE = (CLOCK / (16 * BAUD_RATE)) - 1\r
- *****************************************************************************/\r
-#define BAUD_VALUE_115200               (SYS_CLK_FREQ / (16 * 115200)) - 1\r
-\r
-/***************************************************************************//**\r
- * User edit section- Edit sections below if required\r
- */\r
-#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
-/*\r
- * A base address mapping for the STDIO printf/scanf mapping to CortUARTapb\r
- * must be provided if it is being used\r
- *\r
- * e.g. #define MSCC_STDIO_UART_BASE_ADDR COREUARTAPB1_BASE_ADDR\r
- */\r
-#define MSCC_STDIO_UART_BASE_ADDR COREUARTAPB0_BASE_ADDR\r
-\r
-#ifndef MSCC_STDIO_UART_BASE_ADDR\r
-#error MSCC_STDIO_UART_BASE_ADDR not defined- e.g. #define MSCC_STDIO_UART_BASE_ADDR COREUARTAPB1_BASE_ADDR\r
-#endif\r
-\r
-#ifndef MSCC_STDIO_BAUD_VALUE\r
-/*\r
- * The MSCC_STDIO_BAUD_VALUE define should be set in your project's settings to\r
- * specify the baud value used by the standard output CoreUARTapb instance for\r
- * generating the UART's baud rate if you want a different baud rate from the\r
- * default of 115200 baud\r
- */\r
-#define MSCC_STDIO_BAUD_VALUE           115200\r
-#endif  /*MSCC_STDIO_BAUD_VALUE*/\r
-\r
-#endif  /* end of MSCC_STDIO_THRU_CORE_UART_APB */\r
-/*******************************************************************************\r
- * End of user edit section\r
- */\r
-#endif /* HW_PLATFORM_H */\r
-\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/main.c b/FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/main.c
deleted file mode 100644 (file)
index 59c3093..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-/*\r
- * FreeRTOS Kernel V10.1.1\r
- * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
- * this software and associated documentation files (the "Software"), to deal in\r
- * the Software without restriction, including without limitation the rights to\r
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
- * the Software, and to permit persons to whom the Software is furnished to do so,\r
- * subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included in all\r
- * copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- *\r
- * http://www.FreeRTOS.org\r
- * http://aws.amazon.com/freertos\r
- *\r
- * 1 tab == 4 spaces!\r
- */\r
-\r
-/* FreeRTOS kernel includes. */\r
-#include <FreeRTOS.h>\r
-#include <task.h>\r
-\r
-/* Microsemi includes. */\r
-#include "core_uart_apb.h"\r
-#include "core_gpio.h"\r
-\r
-/******************************************************************************\r
- * This project provides two demo applications.  A simple blinky style project,\r
- * and a more comprehensive test and demo application.  The\r
- * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting (defined in this file) is used to\r
- * select between the two.  The simply blinky demo is implemented and described\r
- * in main_blinky.c.  The more comprehensive test and demo application is\r
- * implemented and described in main_full.c.\r
- *\r
- * This file implements the code that is not demo specific, including the\r
- * hardware setup and standard FreeRTOS hook functions.\r
- *\r
- * ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON\r
- * THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO\r
- * APPLICATION, AND ITS ASSOCIATE FreeRTOS ARCHITECTURE PORT!\r
- *\r
- */\r
-\r
-/* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo,\r
-or 0 to run the more comprehensive test and demo application. */\r
-#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY     0\r
-\r
-/*\r
- * main_blinky() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1.\r
- * main_full() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.\r
- */\r
-#if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1\r
-       extern void main_blinky( void );\r
-#else\r
-       extern void main_full( void );\r
-#endif /* #if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 */\r
-\r
-/* Prototypes for the standard FreeRTOS callback/hook functions implemented\r
-within this file.  See https://www.freertos.org/a00016.html */\r
-void vApplicationMallocFailedHook( void );\r
-void vApplicationIdleHook( void );\r
-void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );\r
-void vApplicationTickHook( void );\r
-\r
-/* Prepare haredware to run the demo. */\r
-static void prvSetupHardware( void );\r
-\r
-/* Send a messaage to the UART initialised in prvSetupHardware. */\r
-void vSendString( const char * const pcString );\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-/* The UART to which strings are output, and the GPIO used to toggle the LED. */\r
-static UART_instance_t g_uart;\r
-static gpio_instance_t g_gpio_out;\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-int main( void )\r
-{\r
-       prvSetupHardware();\r
-\r
-       /* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top\r
-       of this file. */\r
-       #if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 )\r
-       {\r
-               main_blinky();\r
-       }\r
-       #else\r
-       {\r
-               main_full();\r
-       }\r
-       #endif\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-static void prvSetupHardware( void )\r
-{\r
-       PLIC_init();\r
-       UART_init( &g_uart, COREUARTAPB0_BASE_ADDR, BAUD_VALUE_115200, ( DATA_8_BITS | NO_PARITY ) );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vToggleLED( void )\r
-{\r
-static uint32_t ulLEDState = 0;\r
-\r
-       GPIO_set_outputs( &g_gpio_out, ulLEDState );\r
-       ulLEDState = !ulLEDState;\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vSendString( const char * const pcString )\r
-{\r
-       UART_polled_tx_string( &g_uart, pcString );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vApplicationMallocFailedHook( void )\r
-{\r
-       /* vApplicationMallocFailedHook() will only be called if\r
-       configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h.  It is a hook\r
-       function that will get called if a call to pvPortMalloc() fails.\r
-       pvPortMalloc() is called internally by the kernel whenever a task, queue,\r
-       timer or semaphore is created.  It is also called by various parts of the\r
-       demo application.  If heap_1.c or heap_2.c are used, then the size of the\r
-       heap available to pvPortMalloc() is defined by configTOTAL_HEAP_SIZE in\r
-       FreeRTOSConfig.h, and the xPortGetFreeHeapSize() API function can be used\r
-       to query the size of free heap space that remains (although it does not\r
-       provide information on how the remaining heap might be fragmented). */\r
-       taskDISABLE_INTERRUPTS();\r
-       __asm volatile( "ebreak" );\r
-       for( ;; );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vApplicationIdleHook( void )\r
-{\r
-       /* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set\r
-       to 1 in FreeRTOSConfig.h.  It will be called on each iteration of the idle\r
-       task.  It is essential that code added to this hook function never attempts\r
-       to block in any way (for example, call xQueueReceive() with a block time\r
-       specified, or call vTaskDelay()).  If the application makes use of the\r
-       vTaskDelete() API function (as this demo application does) then it is also\r
-       important that vApplicationIdleHook() is permitted to return to its calling\r
-       function, because it is the responsibility of the idle task to clean up\r
-       memory allocated by the kernel to any task that has since been deleted. */\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )\r
-{\r
-       ( void ) pcTaskName;\r
-       ( void ) pxTask;\r
-\r
-       /* Run time stack overflow checking is performed if\r
-       configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2.  This hook\r
-       function is called if a stack overflow is detected. */\r
-       taskDISABLE_INTERRUPTS();\r
-       __asm volatile( "ebreak" );\r
-       for( ;; );\r
-}\r
-/*-----------------------------------------------------------*/\r
-\r
-void vApplicationTickHook( void )\r
-{\r
-       /* The tests in the full demo expect some interaction with interrupts. */\r
-       #if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY != 1 )\r
-       {\r
-               extern void vFullDemoTickHook( void );\r
-               vFullDemoTickHook();\r
-       }\r
-       #endif\r
-}\r
-\r
-\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/.cproject b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/.cproject
new file mode 100644 (file)
index 0000000..af593fd
--- /dev/null
@@ -0,0 +1,374 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">\r
+       \r
+    <storageModule moduleId="org.eclipse.cdt.core.settings">\r
+                       \r
+        <cconfiguration id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127">\r
+                               \r
+            <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127" moduleId="org.eclipse.cdt.core.settings" name="Debug">\r
+                                               \r
+                <externalSettings/>\r
+                                               \r
+                <extensions>\r
+                                                       \r
+                    <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>\r
+                                                       \r
+                    <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>\r
+                                                       \r
+                    <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>\r
+                                                       \r
+                    <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>\r
+                                                       \r
+                    <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>\r
+                                                       \r
+                    <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>\r
+                                               \r
+                </extensions>\r
+                                       \r
+            </storageModule>\r
+                               \r
+            <storageModule moduleId="cdtBuildSystem" version="4.0.0">\r
+                                               \r
+                <configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="${cross_rm} -rf" description="" errorParsers="org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GCCErrorParser" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127" name="Debug" parent="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug" postannouncebuildStep="" postbuildStep="" preannouncebuildStep="" prebuildStep="">\r
+                                                       \r
+                    <folderInfo id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127." name="/" resourcePath="">\r
+                                                                       \r
+                        <toolChain errorParsers="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug.1135421195" name="RISC-V Cross GCC" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug">\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.1236561658" name="Create flash image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.197330232" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.306588546" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1940053873" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.none" valueType="enumerated"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.565243439" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength" useByScannerDiscovery="true" value="false" valueType="boolean"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.321222073" name="'char' is signed (-fsigned-char)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar" useByScannerDiscovery="true" value="true" valueType="boolean"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.1177210712" name="Function sections (-ffunction-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections" useByScannerDiscovery="true" value="true" valueType="boolean"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections.1159308156" name="Data sections (-fdata-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections" useByScannerDiscovery="true" value="true" valueType="boolean"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.400131419" name="Debug level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.max" valueType="enumerated"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format.227460743" name="Debug format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format" useByScannerDiscovery="true"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name.39106845" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name" useByScannerDiscovery="false" value="RISC-V GCC/Newlib" valueType="string"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix.975904647" name="Prefix" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix" useByScannerDiscovery="false" value="riscv64-unknown-elf-" valueType="string"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c.629106139" name="C compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c" useByScannerDiscovery="false" value="gcc" valueType="string"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp.700052137" name="C++ compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp" useByScannerDiscovery="false" value="g++" valueType="string"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar.1315168450" name="Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar" useByScannerDiscovery="false" value="ar" valueType="string"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy.729800518" name="Hex/Bin converter" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy" useByScannerDiscovery="false" value="objcopy" valueType="string"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump.1799678707" name="Listing generator" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump" useByScannerDiscovery="false" value="objdump" valueType="string"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size.2116391716" name="Size command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size" useByScannerDiscovery="false" value="size" valueType="string"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make.323254382" name="Build command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make" useByScannerDiscovery="false" value="make" valueType="string"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm.1360582657" name="Remove command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm" useByScannerDiscovery="false" value="rm" valueType="string"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base.1725087349" name="Architecture" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.arch.rv32i" valueType="enumerated"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply.1573871360" name="Multiply extension (RVM)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer.957415439" name="Integer ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.abi.integer.ilp32" valueType="enumerated"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id.959491385" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id" useByScannerDiscovery="false" value="-2032619395" valueType="string"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.freestanding.224053313" name="Assume freestanding environment (-ffreestanding)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.freestanding" useByScannerDiscovery="true" value="false" valueType="boolean"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions.1322946455" name="Do not inline functions (-fno-inline-functions)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions" useByScannerDiscovery="true" value="false" valueType="boolean"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin.1525203912" name="Disable builtin (-fno-builtin)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin" useByScannerDiscovery="true" value="false" valueType="boolean"/>\r
+                                                                               \r
+                            <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform.1851994667" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform"/>\r
+                                                                               \r
+                            <builder buildPath="${workspace_loc:/miv-rv32im-freertos-port-test}/Debug" errorParsers="org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.CWDLocator" id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.1748717066" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.builder"/>\r
+                                                                               \r
+                            <tool command="${cross_prefix}${cross_c}${cross_suffix}" commandLinePattern="${COMMAND} ${cross_toolchain_flags} ${FLAGS} -c ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GCCErrorParser" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.1205277158" name="GNU RISC-V Cross Assembler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler">\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor.1853992692" name="Use preprocessor" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                                               \r
+                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.include.paths.1792818218" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.include.paths" useByScannerDiscovery="true" valueType="includePath">\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/portable/GCC/RISC-V-RV32/CLINT_no_extensions}&quot;"/>\r
+                                                                                               \r
+                                </option>\r
+                                                                                               \r
+                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.defs.2022258301" name="Defined symbols (-D)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.defs" useByScannerDiscovery="true" valueType="definedSymbols">\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="portasmHANDLE_INTERRUPT=handle_m_ext_interrupt"/>\r
+                                                                                               \r
+                                </option>\r
+                                                                                               \r
+                                <inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input.1786331150" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input"/>\r
+                                                                                       \r
+                            </tool>\r
+                                                                               \r
+                            <tool command="${cross_prefix}${cross_c}${cross_suffix}" commandLinePattern="${COMMAND} ${cross_toolchain_flags} ${FLAGS} -c ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GCCErrorParser" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.894708922" name="GNU RISC-V Cross C Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler">\r
+                                                                                               \r
+                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths.1818715770" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths" useByScannerDiscovery="true" valueType="includePath">\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/include}&quot;"/>\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/full_demo/common_demo_tasks/include}&quot;"/>\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/portable/GCC/RISC-V-RV32}&quot;"/>\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}}&quot;"/>\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/drivers/CoreGPIO}&quot;"/>\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/drivers/Core16550}&quot;"/>\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/drivers/CoreUARTapb}&quot;"/>\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/drivers/CoreTimer}&quot;"/>\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/drivers/CoreSPI}&quot;"/>\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/hal}&quot;"/>\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/riscv_hal}&quot;"/>\r
+                                                                                               \r
+                                </option>\r
+                                                                                               \r
+                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.defs.43291576" name="Defined symbols (-D)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.defs" useByScannerDiscovery="true" valueType="definedSymbols">\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="NOT_MSCC_STDIO_THRU_CORE_UART_APB"/>\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="SYS_CLK_FREQ=66000000"/>\r
+                                                                                               \r
+                                </option>\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.std.1915772035" name="Language standard" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.std" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.std.gnu99" valueType="enumerated"/>\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.other.458885637" name="Other compiler flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.other" useByScannerDiscovery="true" value="" valueType="string"/>\r
+                                                                                               \r
+                                <inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.1901773760" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input"/>\r
+                                                                                       \r
+                            </tool>\r
+                                                                               \r
+                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.1713474071" name="GNU RISC-V Cross C++ Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler"/>\r
+                                                                               \r
+                            <tool command="${cross_prefix}${cross_c}${cross_suffix}" commandLinePattern="${COMMAND} ${cross_toolchain_flags} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.209069143" name="GNU RISC-V Cross C Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker">\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections.991946343" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                                               \r
+                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.scriptfile.746597241" name="Script files (-T)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.scriptfile" useByScannerDiscovery="false" valueType="stringList">\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/microsemi-riscv-renode.ld}&quot;"/>\r
+                                                                                               \r
+                                </option>\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.nostart.1750314954" name="Do not use standard start files (-nostartfiles)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.nostart" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.usenewlibnano.991677097" name="Use newlib-nano (--specs=nano.specs)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.usenewlibnano" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                                               \r
+                                <inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.input.314001493" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.input">\r
+                                                                                                       \r
+                                    <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>\r
+                                                                                                       \r
+                                    <additionalInput kind="additionalinput" paths="$(LIBS)"/>\r
+                                                                                               \r
+                                </inputType>\r
+                                                                                       \r
+                            </tool>\r
+                                                                               \r
+                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.1999185643" name="GNU RISC-V Cross C++ Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker">\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections.1490980679" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections" value="true" valueType="boolean"/>\r
+                                                                                               \r
+                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.scriptfile.1026577013" name="Script files (-T)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.scriptfile" valueType="stringList">\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/Microsemi_Code/riscv_hal/microsemi-riscv-ram.ld}&quot;"/>\r
+                                                                                               \r
+                                </option>\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.nostart.1240127315" name="Do not use standard start files (-nostartfiles)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.nostart" value="true" valueType="boolean"/>\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.usenewlibnano.89628615" name="Use newlib-nano (--specs=nano.specs)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.usenewlibnano" value="true" valueType="boolean"/>\r
+                                                                                       \r
+                            </tool>\r
+                                                                               \r
+                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver.690189418" name="GNU RISC-V Cross Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver"/>\r
+                                                                               \r
+                            <tool command="${cross_prefix}${cross_objcopy}${cross_suffix}" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT}" errorParsers="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash.1183225084" name="GNU RISC-V Cross Create Flash Image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash"/>\r
+                                                                               \r
+                            <tool command="${cross_prefix}${cross_objdump}${cross_suffix}" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT}" errorParsers="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting.876462403" name="GNU RISC-V Cross Create Listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting">\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.source.1650627599" name="Display source (--source|-S)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.source" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.allheaders.1290189840" name="Display all headers (--all-headers|-x)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.allheaders" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.demangle.1153388295" name="Demangle names (--demangle|-C)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.demangle" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.linenumbers.59828896" name="Display line numbers (--line-numbers|-l)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.linenumbers" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.wide.2003727408" name="Wide lines (--wide|-w)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.wide" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
+                                                                                       \r
+                            </tool>\r
+                                                                               \r
+                            <tool command="${cross_prefix}${cross_size}${cross_suffix}" commandLinePattern="${COMMAND} ${FLAGS}" errorParsers="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize.1868273119" name="GNU RISC-V Cross Print Size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize">\r
+                                                                                               \r
+                                <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.printsize.format.1198877735" name="Size format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.printsize.format" useByScannerDiscovery="false"/>\r
+                                                                                       \r
+                            </tool>\r
+                                                                       \r
+                        </toolChain>\r
+                                                               \r
+                    </folderInfo>\r
+                                                       \r
+                    <folderInfo id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127.2040857254" name="/" resourcePath="FreeRTOS_Source/portable/GCC/RISC-V-RV32">\r
+                                                                       \r
+                        <toolChain id="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug.2044939320" name="RISC-V Cross GCC" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug" unusedChildren="">\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.1236561658.1239322423" name="Create flash image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.1236561658"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.197330232.254070997" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.197330232"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.306588546.1504377467" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.306588546"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1940053873.1559389325" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1940053873"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.565243439.274628285" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.565243439"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.321222073.1499829838" name="'char' is signed (-fsigned-char)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.321222073"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.1177210712.1354219954" name="Function sections (-ffunction-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.1177210712"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections.1159308156.508623359" name="Data sections (-fdata-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections.1159308156"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.400131419.1011963167" name="Debug level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.400131419"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format.227460743.501568040" name="Debug format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format.227460743"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name.39106845.885430790" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name.39106845"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix.975904647.286522576" name="Prefix" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix.975904647"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c.629106139.1315521305" name="C compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c.629106139"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp.700052137.2078541690" name="C++ compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp.700052137"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar.1315168450.1495927611" name="Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar.1315168450"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy.729800518.771460854" name="Hex/Bin converter" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy.729800518"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump.1799678707.330854441" name="Listing generator" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump.1799678707"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size.2116391716.557742668" name="Size command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size.2116391716"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make.323254382.1433263142" name="Build command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make.323254382"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm.1360582657.1493900294" name="Remove command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm.1360582657"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base.1725087349.1145147635" name="Architecture" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base.1725087349"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply.1573871360.1788431761" name="Multiply extension (RVM)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.multiply.1573871360"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer.957415439.1640794537" name="Integer ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer.957415439"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id.959491385.1609971273" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id.959491385"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.freestanding.224053313.61470235" name="Assume freestanding environment (-ffreestanding)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.freestanding.224053313"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions.1322946455.1669507419" name="Do not inline functions (-fno-inline-functions)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions.1322946455"/>\r
+                                                                               \r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin.1525203912.1577871892" name="Disable builtin (-fno-builtin)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin.1525203912"/>\r
+                                                                               \r
+                            <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform"/>\r
+                                                                               \r
+                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.1701138834" name="GNU RISC-V Cross Assembler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.1205277158">\r
+                                                                                               \r
+                                <inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input.958497305" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input"/>\r
+                                                                                       \r
+                            </tool>\r
+                                                                               \r
+                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1053378665" name="GNU RISC-V Cross C Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.894708922">\r
+                                                                                               \r
+                                <inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.1855503935" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input"/>\r
+                                                                                       \r
+                            </tool>\r
+                                                                               \r
+                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.1310039856" name="GNU RISC-V Cross C++ Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.1713474071"/>\r
+                                                                               \r
+                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.861501790" name="GNU RISC-V Cross C Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.209069143"/>\r
+                                                                               \r
+                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.892550756" name="GNU RISC-V Cross C++ Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.1999185643"/>\r
+                                                                               \r
+                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver.835675285" name="GNU RISC-V Cross Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver.690189418"/>\r
+                                                                               \r
+                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash.126663148" name="GNU RISC-V Cross Create Flash Image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash.1183225084"/>\r
+                                                                               \r
+                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting.2100288530" name="GNU RISC-V Cross Create Listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting.876462403"/>\r
+                                                                               \r
+                            <tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize.1504637085" name="GNU RISC-V Cross Print Size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize.1868273119"/>\r
+                                                                       \r
+                        </toolChain>\r
+                                                               \r
+                    </folderInfo>\r
+                                                       \r
+                    <sourceEntries>\r
+                                                                       \r
+                        <entry excluding="FreeRTOS/portable/MemMang/heap_5.c|FreeRTOS/portable/MemMang/heap_4.c|FreeRTOS/portable/MemMang/heap_3.c|FreeRTOS/portable/MemMang/heap_1.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>\r
+                                                               \r
+                    </sourceEntries>\r
+                                               \r
+                </configuration>\r
+                                       \r
+            </storageModule>\r
+                               \r
+            <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>\r
+                       \r
+        </cconfiguration>\r
+               \r
+    </storageModule>\r
+       \r
+    <storageModule moduleId="cdtBuildSystem" version="4.0.0">\r
+                       \r
+        <project id="miv-rv32im-freertos-port-test.ilg.gnumcueclipse.managedbuild.cross.riscv.target.elf.1563732131" name="Executable" projectType="ilg.gnumcueclipse.managedbuild.cross.riscv.target.elf"/>\r
+               \r
+    </storageModule>\r
+       \r
+    <storageModule moduleId="scannerConfiguration">\r
+                       \r
+        <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>\r
+                       \r
+        <scannerConfigBuildInfo instanceId="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1785100359;ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1785100359.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1642196096;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.702511061">\r
+                               \r
+            <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>\r
+                       \r
+        </scannerConfigBuildInfo>\r
+                       \r
+        <scannerConfigBuildInfo instanceId="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127;ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.894708922;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.1901773760">\r
+                               \r
+            <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>\r
+                       \r
+        </scannerConfigBuildInfo>\r
+               \r
+    </storageModule>\r
+       \r
+    <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>\r
+       \r
+    <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>\r
+       \r
+    <storageModule moduleId="refreshScope" versionNumber="2">\r
+                       \r
+        <configuration configurationName="Debug">\r
+                               \r
+            <resource resourceType="PROJECT" workspacePath="/RTOSDemo"/>\r
+                       \r
+        </configuration>\r
+               \r
+    </storageModule>\r
+    \r
+</cproject>\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/.project b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/.project
new file mode 100644 (file)
index 0000000..0e8872a
--- /dev/null
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+       <name>RTOSDemo</name>\r
+       <comment></comment>\r
+       <projects>\r
+       </projects>\r
+       <buildSpec>\r
+               <buildCommand>\r
+                       <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>\r
+                       <triggers>clean,full,incremental,</triggers>\r
+                       <arguments>\r
+                       </arguments>\r
+               </buildCommand>\r
+               <buildCommand>\r
+                       <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>\r
+                       <triggers>full,incremental,</triggers>\r
+                       <arguments>\r
+                       </arguments>\r
+               </buildCommand>\r
+       </buildSpec>\r
+       <natures>\r
+               <nature>org.eclipse.cdt.core.cnature</nature>\r
+               <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>\r
+               <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>\r
+       </natures>\r
+       <linkedResources>\r
+               <link>\r
+                       <name>FreeRTOS_Source</name>\r
+                       <type>2</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Source</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks</name>\r
+                       <type>2</type>\r
+                       <locationURI>virtual:/virtual</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/AbortDelay.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/AbortDelay.c</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/EventGroupsDemo.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/EventGroupsDemo.c</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/GenQTest.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/GenQTest.c</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/MessageBufferDemo.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/MessageBufferDemo.c</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/StreamBufferDemo.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/StreamBufferDemo.c</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/StreamBufferInterrupt.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/StreamBufferInterrupt.c</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/TaskNotify.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/TaskNotify.c</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/TimerDemo.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/TimerDemo.c</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/blocktim.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/blocktim.c</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/countsem.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/countsem.c</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/death.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/death.c</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/dynamic.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/dynamic.c</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/include</name>\r
+                       <type>2</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/include</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/common_demo_tasks/recmutex.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/recmutex.c</locationURI>\r
+               </link>\r
+       </linkedResources>\r
+       <filteredResources>\r
+               <filter>\r
+                       <id>1529524430510</id>\r
+                       <name>FreeRTOS_Source</name>\r
+                       <type>9</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-include</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1529524430514</id>\r
+                       <name>FreeRTOS_Source</name>\r
+                       <type>9</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-portable</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1529524430518</id>\r
+                       <name>FreeRTOS_Source</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-event_groups.c</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1529524430521</id>\r
+                       <name>FreeRTOS_Source</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-list.c</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1529524430525</id>\r
+                       <name>FreeRTOS_Source</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-queue.c</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1529524430529</id>\r
+                       <name>FreeRTOS_Source</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-stream_buffer.c</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1529524430533</id>\r
+                       <name>FreeRTOS_Source</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-tasks.c</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1529524430538</id>\r
+                       <name>FreeRTOS_Source</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-timers.c</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1531000165521</id>\r
+                       <name>FreeRTOS_Source/portable</name>\r
+                       <type>9</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-GCC</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1531000165526</id>\r
+                       <name>FreeRTOS_Source/portable</name>\r
+                       <type>9</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-MemMang</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1531000203197</id>\r
+                       <name>FreeRTOS_Source/portable/GCC</name>\r
+                       <type>9</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-RISC-V-RV32</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1529524494421</id>\r
+                       <name>FreeRTOS_Source/portable/MemMang</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-heap_4.c</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1545005412575</id>\r
+                       <name>FreeRTOS_Source/portable/GCC/RISC-V-RV32</name>\r
+                       <type>9</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-CLINT_no_extensions</arguments>\r
+                       </matcher>\r
+               </filter>\r
+       </filteredResources>\r
+       <variableList>\r
+               <variable>\r
+                       <name>FREERTOS_ROOT</name>\r
+                       <value>$%7BPARENT-3-PROJECT_LOC%7D</value>\r
+               </variable>\r
+               <variable>\r
+                       <name>copy_PARENT</name>\r
+                       <value>$%7BPARENT-4-PROJECT_LOC%7D/FreeRTOS/WorkingCopy/FreeRTOS</value>\r
+               </variable>\r
+       </variableList>\r
+</projectDescription>\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/.settings/language.settings.xml b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/.settings/language.settings.xml
new file mode 100644 (file)
index 0000000..eb590e9
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
+<project>\r
+       \r
+    <configuration id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127" name="Debug">\r
+                       \r
+        <extension point="org.eclipse.cdt.core.LanguageSettingsProvider">\r
+                               \r
+            <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>\r
+                               \r
+            <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>\r
+                               \r
+            <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>\r
+                               \r
+            <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="1808514278280795297" id="ilg.gnumcueclipse.managedbuild.cross.riscv.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT RISC-V Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">\r
+                                               \r
+                <language-scope id="org.eclipse.cdt.core.gcc"/>\r
+                                               \r
+                <language-scope id="org.eclipse.cdt.core.g++"/>\r
+                                       \r
+            </provider>\r
+                       \r
+        </extension>\r
+               \r
+    </configuration>\r
+    \r
+</project>\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/FreeRTOSConfig.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/FreeRTOSConfig.h
new file mode 100644 (file)
index 0000000..40a7d85
--- /dev/null
@@ -0,0 +1,148 @@
+/*\r
+    FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd.\r
+    All rights reserved\r
+\r
+    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
+\r
+    This file is part of the FreeRTOS distribution.\r
+\r
+    FreeRTOS is free software; you can redistribute it and/or modify it under\r
+    the terms of the GNU General Public License (version 2) as published by the\r
+    Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.\r
+\r
+    ***************************************************************************\r
+    >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
+    >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
+    >>!   obliged to provide the source code for proprietary components     !<<\r
+    >>!   outside of the FreeRTOS kernel.                                   !<<\r
+    ***************************************************************************\r
+\r
+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
+    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+    FOR A PARTICULAR PURPOSE.  Full license text is available on the following\r
+    link: http://www.freertos.org/a00114.html\r
+\r
+    ***************************************************************************\r
+     *                                                                       *\r
+     *    FreeRTOS provides completely free yet professionally developed,    *\r
+     *    robust, strictly quality controlled, supported, and cross          *\r
+     *    platform software that is more than just the market leader, it     *\r
+     *    is the industry's de facto standard.                               *\r
+     *                                                                       *\r
+     *    Help yourself get started quickly while simultaneously helping     *\r
+     *    to support the FreeRTOS project by purchasing a FreeRTOS           *\r
+     *    tutorial book, reference manual, or both:                          *\r
+     *    http://www.FreeRTOS.org/Documentation                              *\r
+     *                                                                       *\r
+    ***************************************************************************\r
+\r
+    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading\r
+    the FAQ page "My application does not run, what could be wrong?".  Have you\r
+    defined configASSERT()?\r
+\r
+    http://www.FreeRTOS.org/support - In return for receiving this top quality\r
+    embedded software for free we request you assist our global community by\r
+    participating in the support forum.\r
+\r
+    http://www.FreeRTOS.org/training - Investing in training allows your team to\r
+    be as productive as possible as early as possible.  Now you can receive\r
+    FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers\r
+    Ltd, and the world's leading authority on the world's leading RTOS.\r
+\r
+    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
+    including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
+    compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
+\r
+    http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.\r
+    Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.\r
+\r
+    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High\r
+    Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
+    licenses offer ticketed support, indemnification and commercial middleware.\r
+\r
+    http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
+    engineered and independently SIL3 certified version for use in safety and\r
+    mission critical applications that require provable dependability.\r
+\r
+    1 tab == 4 spaces!\r
+*/\r
+\r
+\r
+#ifndef FREERTOS_CONFIG_H\r
+#define FREERTOS_CONFIG_H\r
+\r
+#include "hw_platform.h"\r
+#include "riscv_plic.h"\r
+\r
+/*-----------------------------------------------------------\r
+ * Application specific definitions.\r
+ *\r
+ * These definitions should be adjusted for your particular hardware and\r
+ * application requirements.\r
+ *\r
+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\r
+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\r
+ *\r
+ * See http://www.freertos.org/a00110.html.\r
+ *----------------------------------------------------------*/\r
+\r
+#define configCLINT_BASE_ADDRESS               PRCI_BASE\r
+#define configUSE_PREEMPTION                   1\r
+#define configUSE_IDLE_HOOK                            1\r
+#define configUSE_TICK_HOOK                            1\r
+#define configCPU_CLOCK_HZ                             ( ( uint32_t ) ( SYS_CLK_FREQ ) )\r
+#define configTICK_RATE_HZ                             ( ( TickType_t ) 1000 )\r
+#define configMAX_PRIORITIES                   ( 5 )\r
+#define configMINIMAL_STACK_SIZE               ( ( uint32_t ) 170 ) /* Can be as low as 60 but some of the demo tasks that use this constant require it to be higher. */\r
+#define configTOTAL_HEAP_SIZE                  ( ( size_t ) ( 280 * 1024 ) )\r
+#define configMAX_TASK_NAME_LEN                        ( 16 )\r
+#define configUSE_TRACE_FACILITY               0\r
+#define configUSE_16_BIT_TICKS                 0\r
+#define configIDLE_SHOULD_YIELD                        0\r
+#define configUSE_MUTEXES                              1\r
+#define configQUEUE_REGISTRY_SIZE              8\r
+#define configCHECK_FOR_STACK_OVERFLOW 2\r
+#define configUSE_RECURSIVE_MUTEXES            1\r
+#define configUSE_MALLOC_FAILED_HOOK   1\r
+#define configUSE_APPLICATION_TASK_TAG 0\r
+#define configUSE_COUNTING_SEMAPHORES  1\r
+#define configGENERATE_RUN_TIME_STATS  0\r
+\r
+/* Co-routine definitions. */\r
+#define configUSE_CO_ROUTINES                  0\r
+#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )\r
+\r
+/* Software timer definitions. */\r
+#define configUSE_TIMERS                               1\r
+#define configTIMER_TASK_PRIORITY              ( configMAX_PRIORITIES - 1 )\r
+#define configTIMER_QUEUE_LENGTH               4\r
+#define configTIMER_TASK_STACK_DEPTH   ( configMINIMAL_STACK_SIZE )\r
+\r
+/* Task priorities.  Allow these to be overridden. */\r
+#ifndef uartPRIMARY_PRIORITY\r
+       #define uartPRIMARY_PRIORITY            ( configMAX_PRIORITIES - 3 )\r
+#endif\r
+\r
+/* Set the following definitions to 1 to include the API function, or zero\r
+to exclude the API function. */\r
+#define INCLUDE_vTaskPrioritySet                       1\r
+#define INCLUDE_uxTaskPriorityGet                      1\r
+#define INCLUDE_vTaskDelete                                    1\r
+#define INCLUDE_vTaskCleanUpResources          1\r
+#define INCLUDE_vTaskSuspend                           1\r
+#define INCLUDE_vTaskDelayUntil                                1\r
+#define INCLUDE_vTaskDelay                                     1\r
+#define INCLUDE_eTaskGetState                          1\r
+#define INCLUDE_xTimerPendFunctionCall         1\r
+#define INCLUDE_xTaskAbortDelay                                1\r
+#define INCLUDE_xTaskGetHandle                         1\r
+#define INCLUDE_xSemaphoreGetMutexHolder       1\r
+\r
+/* Normal assert() semantics without relying on the provision of an assert.h\r
+header file. */\r
+#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); __asm volatile( "ebreak" ); for( ;; ); }\r
+\r
+#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\r
+\r
+\r
+#endif /* FREERTOS_CONFIG_H */\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/Packages/.repos.xml b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/Packages/.repos.xml
new file mode 100644 (file)
index 0000000..76dbb89
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<repositories>\r
+  <repository>\r
+    <type>CMSIS Pack</type>\r
+    <name>Keil</name>\r
+    <url>http://www.keil.com/pack/index.pidx</url>\r
+  </repository>\r
+</repositories>\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/Core16550/core16550_regs.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/Core16550/core16550_regs.h
new file mode 100644 (file)
index 0000000..0b921ce
--- /dev/null
@@ -0,0 +1,582 @@
+/*******************************************************************************\r
+ * (c) Copyright 2007-2015 Microsemi SoC Products Group. All rights reserved.\r
+ *\r
+ * IP core registers definitions. This file contains the definitions required\r
+ * for accessing the IP core through the hardware abstraction layer (HAL).\r
+ * This file was automatically generated, using "get_header.exe" version 0.4.0,\r
+ * from the IP-XACT description for:\r
+ *\r
+ *             Core16550    version: 2.0.0\r
+ *\r
+ * SVN $Revision: 7963 $\r
+ * SVN $Date: 2015-10-09 17:58:21 +0530 (Fri, 09 Oct 2015) $\r
+ *\r
+ *******************************************************************************/\r
+#ifndef CORE_16550_REGISTERS_H_\r
+#define CORE_16550_REGISTERS_H_ 1\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/*******************************************************************************\r
+ * RBR register:\r
+ *------------------------------------------------------------------------------\r
+ * Receive Buffer Register\r
+ */\r
+#define RBR_REG_OFFSET 0x00U\r
+\r
+/*******************************************************************************\r
+ * THR register:\r
+ *------------------------------------------------------------------------------\r
+ * Transmit Holding Register\r
+ */\r
+#define THR_REG_OFFSET 0x00U\r
+\r
+/*******************************************************************************\r
+ * DLR register:\r
+ *------------------------------------------------------------------------------\r
+ * Divisor Latch(LSB) Register\r
+ */\r
+#define DLR_REG_OFFSET 0x00U\r
+\r
+/*******************************************************************************\r
+ * DMR register:\r
+ *------------------------------------------------------------------------------\r
+ * Divisor Latch(MSB) Register\r
+ */\r
+#define DMR_REG_OFFSET 0x04U\r
+\r
+/*******************************************************************************\r
+ * IER register:\r
+ *------------------------------------------------------------------------------\r
+ * Interrupt Enable Register\r
+ */\r
+#define IER_REG_OFFSET 0x04U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * IER_ERBFI:\r
+ *   ERBFI field of register IER.\r
+ *------------------------------------------------------------------------------\r
+ * Enables Received Data Available Interrupt. 0 - Disabled; 1 - Enabled\r
+ */\r
+#define IER_ERBFI_OFFSET   0x04U\r
+#define IER_ERBFI_MASK     0x01U\r
+#define IER_ERBFI_SHIFT    0U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * IER_ETBEI:\r
+ *   ETBEI field of register IER.\r
+ *------------------------------------------------------------------------------\r
+ * Enables the Transmitter Holding Register Empty Interrupt. 0 - Disabled; 1 - \r
+ * Enabled\r
+ */\r
+#define IER_ETBEI_OFFSET   0x04U\r
+#define IER_ETBEI_MASK     0x02U\r
+#define IER_ETBEI_SHIFT    1U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * IER_ELSI:\r
+ *   ELSI field of register IER.\r
+ *------------------------------------------------------------------------------\r
+ * Enables the Receiver Line Status Interrupt. 0 - Disabled; 1 - Enabled\r
+ */\r
+#define IER_ELSI_OFFSET   0x04U\r
+#define IER_ELSI_MASK     0x04U\r
+#define IER_ELSI_SHIFT    2U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * IER_EDSSI:\r
+ *   EDSSI field of register IER.\r
+ *------------------------------------------------------------------------------\r
+ *  Enables the Modem Status Interrupt 0 - Disabled; 1 - Enabled\r
+ */\r
+#define IER_EDSSI_OFFSET   0x04U\r
+#define IER_EDSSI_MASK     0x08U\r
+#define IER_EDSSI_SHIFT    3U\r
+\r
+/*******************************************************************************\r
+ * IIR register:\r
+ *------------------------------------------------------------------------------\r
+ * Interrupt Identification\r
+ */\r
+#define IIR_REG_OFFSET 0x08U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * IIR_IIR:\r
+ *   IIR field of register IIR.\r
+ *------------------------------------------------------------------------------\r
+ * Interrupt Identification bits.\r
+ */\r
+#define IIR_IIR_OFFSET   0x08U\r
+#define IIR_IIR_MASK     0x0FU\r
+#define IIR_IIR_SHIFT    0U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * IIR_IIR:\r
+ *   IIR field of register IIR.\r
+ *------------------------------------------------------------------------------\r
+ * Interrupt Identification bits.\r
+ */\r
+\r
+/*------------------------------------------------------------------------------\r
+ * IIR_Mode:\r
+ *   Mode field of register IIR.\r
+ *------------------------------------------------------------------------------\r
+ * 11 - FIFO mode\r
+ */\r
+#define IIR_MODE_OFFSET   0x08U\r
+#define IIR_MODE_MASK     0xC0U\r
+#define IIR_MODE_SHIFT    6U\r
+\r
+/*******************************************************************************\r
+ * FCR register:\r
+ *------------------------------------------------------------------------------\r
+ * FIFO Control Register\r
+ */\r
+#define FCR_REG_OFFSET 0x08\r
+\r
+/*------------------------------------------------------------------------------\r
+ * FCR_Bit0:\r
+ *   Bit0 field of register FCR.\r
+ *------------------------------------------------------------------------------\r
+ * This bit enables both the TX and RX FIFOs.\r
+ */\r
+#define FCR_BIT0_OFFSET   0x08U\r
+#define FCR_BIT0_MASK     0x01U\r
+#define FCR_BIT0_SHIFT    0U\r
+\r
+#define FCR_ENABLE_OFFSET   0x08U\r
+#define FCR_ENABLE_MASK     0x01U\r
+#define FCR_ENABLE_SHIFT    0U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * FCR_Bit1:\r
+ *   Bit1 field of register FCR.\r
+ *------------------------------------------------------------------------------\r
+ * Clears all bytes in the RX FIFO and resets its counter logic. The shift \r
+ * register is not cleared.  0 - Disabled; 1 - Enabled\r
+ */\r
+#define FCR_BIT1_OFFSET   0x08U\r
+#define FCR_BIT1_MASK     0x02U\r
+#define FCR_BIT1_SHIFT    1U\r
+\r
+#define FCR_CLEAR_RX_OFFSET   0x08U\r
+#define FCR_CLEAR_RX_MASK     0x02U\r
+#define FCR_CLEAR_RX_SHIFT    1U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * FCR_Bit2:\r
+ *   Bit2 field of register FCR.\r
+ *------------------------------------------------------------------------------\r
+ * Clears all bytes in the TX FIFO and resets its counter logic. The shift \r
+ * register is not cleared.  0 - Disabled; 1 - Enabled\r
+ */\r
+#define FCR_BIT2_OFFSET   0x08U\r
+#define FCR_BIT2_MASK     0x04U\r
+#define FCR_BIT2_SHIFT    2U\r
+\r
+#define FCR_CLEAR_TX_OFFSET   0x08U\r
+#define FCR_CLEAR_TX_MASK     0x04U\r
+#define FCR_CLEAR_TX_SHIFT    2U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * FCR_Bit3:\r
+ *   Bit3 field of register FCR.\r
+ *------------------------------------------------------------------------------\r
+ * Enables RXRDYN and TXRDYN pins when set to 1. Otherwise, they are disabled.\r
+ */\r
+#define FCR_BIT3_OFFSET   0x08U\r
+#define FCR_BIT3_MASK     0x08U\r
+#define FCR_BIT3_SHIFT    3U\r
+\r
+#define FCR_RDYN_EN_OFFSET   0x08U\r
+#define FCR_RDYN_EN_MASK     0x08U\r
+#define FCR_RDYN_EN_SHIFT    3U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * FCR_Bit6:\r
+ *   Bit6 field of register FCR.\r
+ *------------------------------------------------------------------------------\r
+ * These bits are used to set the trigger level for the RX FIFO interrupt. RX \r
+ * FIFO Trigger Level: 0 - 1; 1 - 4; 2 - 8; 3 - 14\r
+ */\r
+#define FCR_BIT6_OFFSET   0x08U\r
+#define FCR_BIT6_MASK     0xC0U\r
+#define FCR_BIT6_SHIFT    6U\r
+\r
+#define FCR_TRIG_LEVEL_OFFSET   0x08U\r
+#define FCR_TRIG_LEVEL_MASK     0xC0U\r
+#define FCR_TRIG_LEVEL_SHIFT    6U\r
+\r
+/*******************************************************************************\r
+ * LCR register:\r
+ *------------------------------------------------------------------------------\r
+ * Line Control Register\r
+ */\r
+#define LCR_REG_OFFSET 0x0CU\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LCR_WLS:\r
+ *   WLS field of register LCR.\r
+ *------------------------------------------------------------------------------\r
+ * Word Length Select: 00 - 5 bits; 01 - 6 bits; 10 - 7 bits; 11 - 8 bits\r
+ */\r
+#define LCR_WLS_OFFSET   0x0CU\r
+#define LCR_WLS_MASK     0x03U\r
+#define LCR_WLS_SHIFT    0U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LCR_STB:\r
+ *   STB field of register LCR.\r
+ *------------------------------------------------------------------------------\r
+ * Number of Stop Bits: 0 - 1 stop bit; 1 - 1½ stop bits when WLS = 00, 2 stop \r
+ * bits in other cases\r
+ */\r
+#define LCR_STB_OFFSET   0x0CU\r
+#define LCR_STB_MASK     0x04U\r
+#define LCR_STB_SHIFT    2U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LCR_PEN:\r
+ *   PEN field of register LCR.\r
+ *------------------------------------------------------------------------------\r
+ * Parity Enable 0 - Disabled; 1 - Enabled. Parity is added in transmission and \r
+ * checked in receiving.\r
+ */\r
+#define LCR_PEN_OFFSET   0x0CU\r
+#define LCR_PEN_MASK     0x08U\r
+#define LCR_PEN_SHIFT    3U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LCR_EPS:\r
+ *   EPS field of register LCR.\r
+ *------------------------------------------------------------------------------\r
+ * Even Parity Select 0 - Odd parity; 1 - Even parity\r
+ */\r
+#define LCR_EPS_OFFSET   0x0CU\r
+#define LCR_EPS_MASK     0x10U\r
+#define LCR_EPS_SHIFT    4U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LCR_SP:\r
+ *   SP field of register LCR.\r
+ *------------------------------------------------------------------------------\r
+ * Stick Parity 0 - Disabled; 1 - Enabled When stick parity is enabled, it \r
+ * works as follows: Bits 4..3, 11 - 0 will be sent as a parity bit, and \r
+ * checked in receiving.  01 - 1 will be sent as a parity bit, and checked in \r
+ * receiving.\r
+ */\r
+#define LCR_SP_OFFSET   0x0CU\r
+#define LCR_SP_MASK     0x20U\r
+#define LCR_SP_SHIFT    5U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LCR_SB:\r
+ *   SB field of register LCR.\r
+ *------------------------------------------------------------------------------\r
+ * Set Break 0 - Disabled 1 - Set break. SOUT is forced to 0. This does not \r
+ * have any effect on transmitter logic. The break is disabled by setting the \r
+ * bit to 0.\r
+ */\r
+#define LCR_SB_OFFSET   0x0CU\r
+#define LCR_SB_MASK     0x40U\r
+#define LCR_SB_SHIFT    6U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LCR_DLAB:\r
+ *   DLAB field of register LCR.\r
+ *------------------------------------------------------------------------------\r
+ * Divisor Latch Access Bit 0 - Disabled. Normal addressing mode in use 1 - \r
+ * Enabled. Enables access to the Divisor Latch registers during read or write \r
+ * operation to addresses 0 and 1.\r
+ */\r
+#define LCR_DLAB_OFFSET   0x0CU\r
+#define LCR_DLAB_MASK     0x80U\r
+#define LCR_DLAB_SHIFT    7U\r
+\r
+/*******************************************************************************\r
+ * MCR register:\r
+ *------------------------------------------------------------------------------\r
+ * Modem Control Register\r
+ */\r
+#define MCR_REG_OFFSET 0x10U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MCR_DTR:\r
+ *   DTR field of register MCR.\r
+ *------------------------------------------------------------------------------\r
+ * Controls the Data Terminal Ready (DTRn) output.  0 - DTRn <= 1; 1 - DTRn <= 0\r
+ */\r
+#define MCR_DTR_OFFSET   0x10U\r
+#define MCR_DTR_MASK     0x01U\r
+#define MCR_DTR_SHIFT    0U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MCR_RTS:\r
+ *   RTS field of register MCR.\r
+ *------------------------------------------------------------------------------\r
+ * Controls the Request to Send (RTSn) output.  0 - RTSn <= 1; 1 - RTSn <= 0\r
+ */\r
+#define MCR_RTS_OFFSET   0x10U\r
+#define MCR_RTS_MASK     0x02U\r
+#define MCR_RTS_SHIFT    1U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MCR_Out1:\r
+ *   Out1 field of register MCR.\r
+ *------------------------------------------------------------------------------\r
+ * Controls the Output1 (OUT1n) signal.  0 - OUT1n <= 1; 1 - OUT1n <= 0\r
+ */\r
+#define MCR_OUT1_OFFSET   0x10U\r
+#define MCR_OUT1_MASK     0x04U\r
+#define MCR_OUT1_SHIFT    2U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MCR_Out2:\r
+ *   Out2 field of register MCR.\r
+ *------------------------------------------------------------------------------\r
+ * Controls the Output2 (OUT2n) signal.  0 - OUT2n <=1; 1 - OUT2n <=0\r
+ */\r
+#define MCR_OUT2_OFFSET   0x10U\r
+#define MCR_OUT2_MASK     0x08U\r
+#define MCR_OUT2_SHIFT    3U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MCR_Loop:\r
+ *   Loop field of register MCR.\r
+ *------------------------------------------------------------------------------\r
+ * Loop enable bit 0 - Disabled; 1 - Enabled. The following happens in loop \r
+ * mode: SOUT is set to 1. The SIN, DSRn, CTSn, RIn, and DCDn inputs are \r
+ * disconnected.  The output of the Transmitter Shift Register is looped back \r
+ * into the Receiver Shift Register. The modem control outputs (DTRn, RTSn, \r
+ * OUT1n, and OUT2n) are connected internally to the modem control inputs, and \r
+ * the modem control output pins are set at 1. In loopback mode, the \r
+ * transmitted data is immediately received, allowing the CPU to check the \r
+ * operation of the UART. The interrupts are operating in loop mode.\r
+ */\r
+#define MCR_LOOP_OFFSET   0x10U\r
+#define MCR_LOOP_MASK     0x10U\r
+#define MCR_LOOP_SHIFT    4U\r
+\r
+/*******************************************************************************\r
+ * LSR register:\r
+ *------------------------------------------------------------------------------\r
+ * Line Status Register\r
+ */\r
+#define LSR_REG_OFFSET 0x14U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LSR_DR:\r
+ *   DR field of register LSR.\r
+ *------------------------------------------------------------------------------\r
+ * Data Ready indicator 1 when a data byte has been received and stored in the \r
+ * FIFO. DR is cleared to 0 when the CPU reads the data from the FIFO.\r
+ */\r
+#define LSR_DR_OFFSET   0x14U\r
+#define LSR_DR_MASK     0x01U\r
+#define LSR_DR_SHIFT    0U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LSR_OE:\r
+ *   OE field of register LSR.\r
+ *------------------------------------------------------------------------------\r
+ * Overrun Error indicator Indicates that the new byte was received before the \r
+ * CPU read the byte from the receive buffer, and that the earlier data byte \r
+ * was destroyed. OE is cleared when the CPU reads the Line Status Register. If \r
+ * the data continues to fill the FIFO beyond the trigger level, an overrun \r
+ * error will occur once the FIFO is full and the next character has been \r
+ * completely received in the shift register. The character in the shift \r
+ * register is overwritten, but it is not transferred to the FIFO.\r
+ */\r
+#define LSR_OE_OFFSET   0x14U\r
+#define LSR_OE_MASK     0x02U\r
+#define LSR_OE_SHIFT    1U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LSR_PE:\r
+ *   PE field of register LSR.\r
+ *------------------------------------------------------------------------------\r
+ * Parity Error indicator Indicates that the received byte had a parity error. \r
+ * PE is cleared when the CPU reads the Line Status Register. This error is \r
+ * revealed to the CPU when its associated character is at the top of the FIFO.\r
+ */\r
+#define LSR_PE_OFFSET   0x14U\r
+#define LSR_PE_MASK     0x04U\r
+#define LSR_PE_SHIFT    2U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LSR_FE:\r
+ *   FE field of register LSR.\r
+ *------------------------------------------------------------------------------\r
+ *  Framing Error indicator Indicates that the received byte did not have a \r
+ * valid Stop bit. FE is cleared when the CPU reads the Line Status Register. \r
+ * The UART will try to re-synchronize after a framing error. To do this, it\r
+ * assumes that the framing error was due to the next start bit, so it samples \r
+ * this start bit twice, and then starts receiving the data.  This error is \r
+ * revealed to the CPU when its associated character is at the top of the FIFO.\r
+ */\r
+#define LSR_FE_OFFSET   0x14U\r
+#define LSR_FE_MASK     0x08U\r
+#define LSR_FE_SHIFT    3U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LSR_BI:\r
+ *   BI field of register LSR.\r
+ *------------------------------------------------------------------------------\r
+ * Break Interrupt indicator Indicates that the received data is at 0 longer \r
+ * than a full word transmission time (start bit + data bits + parity + stop \r
+ * bits). BI is cleared when the CPU reads the Line Status Register. This error \r
+ * is revealed to the CPU when its associated character is at the top of the \r
+ * FIFO. When break occurs, only one zero character is loaded into the FIFO.\r
+ */\r
+#define LSR_BI_OFFSET   0x14U\r
+#define LSR_BI_MASK     0x10U\r
+#define LSR_BI_SHIFT    4U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LSR_THRE:\r
+ *   THRE field of register LSR.\r
+ *------------------------------------------------------------------------------\r
+ *  Transmitter Holding Register Empty indicator Indicates that the UART is \r
+ * ready to transmit a new data byte. THRE causes an interrupt to the CPU when \r
+ * bit 1 (ETBEI) in the Interrupt Enable Register is 1.  This bit is set when \r
+ * the TX FIFO is empty. It is cleared when at least one byte is written to the \r
+ * TX FIFO.\r
+ */\r
+#define LSR_THRE_OFFSET   0x14U\r
+#define LSR_THRE_MASK     0x20U\r
+#define LSR_THRE_SHIFT    5U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LSR_TEMT:\r
+ *   TEMT field of register LSR.\r
+ *------------------------------------------------------------------------------\r
+ *  Transmitter Empty indicator This bit is set to 1 when both the transmitter \r
+ * FIFO and shift registers are empty.\r
+ */\r
+#define LSR_TEMT_OFFSET   0x14U\r
+#define LSR_TEMT_MASK     0x40U\r
+#define LSR_TEMT_SHIFT    6U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * LSR_FIER:\r
+ *   FIER field of register LSR.\r
+ *------------------------------------------------------------------------------\r
+ *  This bit is set when there is at least one parity error, framing error, or \r
+ * break indication in the FIFO. FIER is cleared when the CPU reads the LSR if \r
+ * there are no subsequent errors in the FIFO.\r
+ */\r
+#define LSR_FIER_OFFSET   0x14U\r
+#define LSR_FIER_MASK     0x80U\r
+#define LSR_FIER_SHIFT    7U\r
+\r
+/*******************************************************************************\r
+ * MSR register:\r
+ *------------------------------------------------------------------------------\r
+ * Modem Status Register\r
+ */\r
+#define MSR_REG_OFFSET 0x18U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MSR_DCTS:\r
+ *   DCTS field of register MSR.\r
+ *------------------------------------------------------------------------------\r
+ * Delta Clear to Send indicator.  Indicates that the CTSn input has changed \r
+ * state since the last time it was read by the CPU.\r
+ */\r
+#define MSR_DCTS_OFFSET   0x18U\r
+#define MSR_DCTS_MASK     0x01U\r
+#define MSR_DCTS_SHIFT    0U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MSR_DDSR:\r
+ *   DDSR field of register MSR.\r
+ *------------------------------------------------------------------------------\r
+ * Delta Data Set Ready indicator Indicates that the DSRn input has changed \r
+ * state since the last time it was read by the CPU.\r
+ */\r
+#define MSR_DDSR_OFFSET   0x18U\r
+#define MSR_DDSR_MASK     0x02U\r
+#define MSR_DDSR_SHIFT    1U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MSR_TERI:\r
+ *   TERI field of register MSR.\r
+ *------------------------------------------------------------------------------\r
+ * Trailing Edge of Ring Indicator detector. Indicates that RI input has \r
+ * changed from 0 to 1.\r
+ */\r
+#define MSR_TERI_OFFSET   0x18U\r
+#define MSR_TERI_MASK     0x04U\r
+#define MSR_TERI_SHIFT    2U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MSR_DDCD:\r
+ *   DDCD field of register MSR.\r
+ *------------------------------------------------------------------------------\r
+ * Delta Data Carrier Detect indicator Indicates that DCD input has changed \r
+ * state.  NOTE: Whenever bit 0, 1, 2, or 3 is set to 1, a Modem Status \r
+ * Interrupt is generated.\r
+ */\r
+#define MSR_DDCD_OFFSET   0x18U\r
+#define MSR_DDCD_MASK     0x08U\r
+#define MSR_DDCD_SHIFT    3U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MSR_CTS:\r
+ *   CTS field of register MSR.\r
+ *------------------------------------------------------------------------------\r
+ * Clear to Send The complement of the CTSn input. When bit 4 of the Modem \r
+ * Control Register (MCR) is set to 1 (loop), this bit is equivalent to DTR in \r
+ * the MCR.\r
+ */\r
+#define MSR_CTS_OFFSET   0x18U\r
+#define MSR_CTS_MASK     0x10U\r
+#define MSR_CTS_SHIFT    4U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MSR_DSR:\r
+ *   DSR field of register MSR.\r
+ *------------------------------------------------------------------------------\r
+ * Data Set Ready The complement of the DSR input. When bit 4 of the MCR is set \r
+ * to 1 (loop), this bit is equivalent to RTSn in the MCR.\r
+ */\r
+#define MSR_DSR_OFFSET   0x18U\r
+#define MSR_DSR_MASK     0x20U\r
+#define MSR_DSR_SHIFT    5U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MSR_RI:\r
+ *   RI field of register MSR.\r
+ *------------------------------------------------------------------------------\r
+ * Ring Indicator The complement of the RIn input. When bit 4 of the MCR is set \r
+ * to 1 (loop), this bit is equivalent to OUT1 in the MCR.\r
+ */\r
+#define MSR_RI_OFFSET   0x18U\r
+#define MSR_RI_MASK     0x40U\r
+#define MSR_RI_SHIFT    6U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * MSR_DCD:\r
+ *   DCD field of register MSR.\r
+ *------------------------------------------------------------------------------\r
+ * Data Carrier Detect The complement of DCDn input. When bit 4 of the MCR is \r
+ * set to 1 (loop), this bit is equivalent to OUT2 in the MCR.\r
+ */\r
+#define MSR_DCD_OFFSET   0x18U\r
+#define MSR_DCD_MASK     0x80U\r
+#define MSR_DCD_SHIFT    7U\r
+\r
+/*******************************************************************************\r
+ * SR register:\r
+ *------------------------------------------------------------------------------\r
+ * Scratch Register\r
+ */\r
+#define SR_REG_OFFSET  0x1CU\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* CORE_16550_REGISTERS_H_*/\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/Core16550/core_16550.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/Core16550/core_16550.c
new file mode 100644 (file)
index 0000000..ca735e6
--- /dev/null
@@ -0,0 +1,865 @@
+/*******************************************************************************\r
+ * (c) Copyright 2007-2015 Microsemi SoC Products Group. All rights reserved.\r
+ *\r
+ * Core16550 driver implementation. See file "core_16550.h" for a\r
+ * description of the functions implemented in this file.\r
+ *\r
+ * SVN $Revision: 7963 $\r
+ * SVN $Date: 2015-10-09 17:58:21 +0530 (Fri, 09 Oct 2015) $\r
+ */\r
+#include "hal.h"\r
+#include "core_16550.h"\r
+#include "core16550_regs.h"\r
+#include "hal_assert.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/*******************************************************************************\r
+ * Definitions for transmitter states\r
+ */\r
+#define TX_COMPLETE     0x00U\r
+\r
+/*******************************************************************************\r
+ * Definition for transmitter FIFO size\r
+ */\r
+#define TX_FIFO_SIZE    16U\r
+\r
+/*******************************************************************************\r
+ * Default receive interrupt trigger level\r
+ */\r
+#define DEFAULT_RX_TRIG_LEVEL  ((uint8_t)UART_16550_FIFO_SINGLE_BYTE)\r
+\r
+/*******************************************************************************\r
+ * Receiver error status mask and shift offset\r
+ */\r
+#define STATUS_ERROR_MASK   ( LSR_OE_MASK | LSR_PE_MASK |  \\r
+                              LSR_FE_MASK | LSR_BI_MASK | LSR_FIER_MASK)\r
+\r
+/*******************************************************************************\r
+ * Definitions for invalid parameters with proper type\r
+ */\r
+#define INVALID_INTERRUPT   0U\r
+#define INVALID_IRQ_HANDLER ( (uart_16550_irq_handler_t) 0 )\r
+\r
+/*******************************************************************************\r
+ * Possible values for Interrupt Identification Register Field.\r
+ */\r
+#define IIRF_MODEM_STATUS       0x00U\r
+#define IIRF_THRE               0x02U\r
+#define IIRF_RX_DATA            0x04U\r
+#define IIRF_RX_LINE_STATUS     0x06U\r
+#define IIRF_DATA_TIMEOUT       0x0CU\r
+\r
+/*******************************************************************************\r
+ * Null parameters with appropriate type definitions\r
+ */\r
+#define NULL_ADDR       ( ( addr_t ) 0 )\r
+#define NULL_INSTANCE   ( ( uart_16550_instance_t * ) 0 )\r
+#define NULL_BUFF       ( ( uint8_t * ) 0 )\r
+\r
+/*******************************************************************************\r
+ * Possible states for different register bit fields\r
+ */\r
+enum {\r
+    DISABLE = 0U,\r
+    ENABLE  = 1U\r
+};\r
+\r
+/*******************************************************************************\r
+ * Static function declarations\r
+ */\r
+static void default_tx_handler(uart_16550_instance_t * this_uart);\r
+\r
+/*******************************************************************************\r
+ * Public function definitions\r
+ */\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_init.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+void\r
+UART_16550_init\r
+(\r
+    uart_16550_instance_t* this_uart,\r
+    addr_t base_addr,\r
+    uint16_t baud_value,\r
+    uint8_t line_config\r
+)\r
+{\r
+#ifndef NDEBUG\r
+    uint8_t dbg1;\r
+    uint8_t dbg2;\r
+#endif\r
+    uint8_t fifo_config;\r
+    uint8_t temp;\r
+\r
+    HAL_ASSERT( base_addr != NULL_ADDR );\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE );\r
+\r
+    if( ( base_addr != NULL_ADDR ) && ( this_uart != NULL_INSTANCE ) )\r
+    {\r
+        /* disable interrupts */\r
+        HAL_set_8bit_reg(base_addr, IER, DISABLE);\r
+\r
+        /* reset divisor latch */\r
+        HAL_set_8bit_reg_field(base_addr, LCR_DLAB, ENABLE);\r
+#ifndef NDEBUG\r
+        dbg1 =  HAL_get_8bit_reg_field(base_addr, LCR_DLAB );\r
+        HAL_ASSERT( dbg1 == ENABLE );\r
+#endif\r
+        /* MSB of baud value */\r
+        temp = (uint8_t)(baud_value >> 8);\r
+        HAL_set_8bit_reg(base_addr, DMR, temp );\r
+        /* LSB of baud value */\r
+        HAL_set_8bit_reg(base_addr, DLR, ( (uint8_t)baud_value ) );\r
+#ifndef NDEBUG\r
+        dbg1 =  HAL_get_8bit_reg(base_addr, DMR );\r
+        dbg2 =  HAL_get_8bit_reg(base_addr, DLR );\r
+        HAL_ASSERT( ( ( ( (uint16_t) dbg1 ) << 8 ) | dbg2 ) == baud_value );\r
+#endif\r
+        /* reset divisor latch */\r
+        HAL_set_8bit_reg_field(base_addr, LCR_DLAB, DISABLE);\r
+#ifndef NDEBUG\r
+        dbg1 =  HAL_get_8bit_reg_field(base_addr, LCR_DLAB );\r
+        HAL_ASSERT( dbg1 == DISABLE );\r
+#endif\r
+        /* set the line control register (bit length, stop bits, parity) */\r
+        HAL_set_8bit_reg( base_addr, LCR, line_config );\r
+#ifndef NDEBUG\r
+        dbg1 =  HAL_get_8bit_reg(base_addr, LCR );\r
+        HAL_ASSERT( dbg1 == line_config)\r
+#endif\r
+        /* Enable and configure the RX and TX FIFOs. */\r
+        fifo_config = ((uint8_t)(DEFAULT_RX_TRIG_LEVEL << FCR_TRIG_LEVEL_SHIFT) |\r
+                                 FCR_RDYN_EN_MASK | FCR_CLEAR_RX_MASK |\r
+                                 FCR_CLEAR_TX_MASK | FCR_ENABLE_MASK );\r
+        HAL_set_8bit_reg( base_addr, FCR, fifo_config );\r
+\r
+        /* disable loopback */\r
+        HAL_set_8bit_reg_field( base_addr, MCR_LOOP, DISABLE );\r
+#ifndef NDEBUG\r
+        dbg1 =  HAL_get_8bit_reg_field(base_addr, MCR_LOOP);\r
+        HAL_ASSERT( dbg1 == DISABLE );\r
+#endif\r
+\r
+        /* Instance setup */\r
+        this_uart->base_address = base_addr;\r
+        this_uart->tx_buffer    = NULL_BUFF;\r
+        this_uart->tx_buff_size = TX_COMPLETE;\r
+        this_uart->tx_idx       = 0U;\r
+        this_uart->tx_handler   = default_tx_handler;\r
+\r
+        this_uart->rx_handler  = ( (uart_16550_irq_handler_t) 0 );\r
+        this_uart->linests_handler  = ( (uart_16550_irq_handler_t) 0 );\r
+        this_uart->modemsts_handler = ( (uart_16550_irq_handler_t) 0 );\r
+        this_uart->status = 0U;\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_polled_tx.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+void\r
+UART_16550_polled_tx\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    const uint8_t * pbuff,\r
+    uint32_t tx_size\r
+)\r
+{\r
+    uint32_t char_idx = 0U;\r
+    uint32_t size_sent;\r
+    uint8_t status;\r
+\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE );\r
+    HAL_ASSERT( pbuff != NULL_BUFF );\r
+    HAL_ASSERT( tx_size > 0U );\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) &&\r
+        ( pbuff != NULL_BUFF ) &&\r
+        ( tx_size > 0U ) )\r
+    {\r
+        /* Remain in this loop until the entire input buffer\r
+         * has been transferred to the UART.\r
+         */\r
+        do {\r
+            /* Read the Line Status Register and update the sticky record */\r
+            status = HAL_get_8bit_reg( this_uart->base_address, LSR );\r
+            this_uart->status |= status;\r
+\r
+            /* Check if TX FIFO is empty. */\r
+            if( status & LSR_THRE_MASK )\r
+            {\r
+                uint32_t fill_size = TX_FIFO_SIZE;\r
+\r
+                /* Calculate the number of bytes to transmit. */\r
+                if ( tx_size < TX_FIFO_SIZE )\r
+                {\r
+                    fill_size = tx_size;\r
+                }\r
+\r
+                /* Fill the TX FIFO with the calculated the number of bytes. */\r
+                for ( size_sent = 0U; size_sent < fill_size; ++size_sent )\r
+                {\r
+                    /* Send next character in the buffer. */\r
+                    HAL_set_8bit_reg( this_uart->base_address, THR,\r
+                                      (uint_fast8_t)pbuff[char_idx++]);\r
+                }\r
+\r
+                /* Calculate the number of untransmitted bytes remaining. */\r
+                tx_size -= size_sent;\r
+            }\r
+        } while ( tx_size );\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_polled_tx_string.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+void\r
+UART_16550_polled_tx_string\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    const uint8_t * p_sz_string\r
+)\r
+{\r
+    uint32_t char_idx = 0U;\r
+    uint32_t fill_size;\r
+    uint_fast8_t data_byte;\r
+    uint8_t status;\r
+\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE );\r
+    HAL_ASSERT( p_sz_string != NULL_BUFF );\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) && ( p_sz_string != NULL_BUFF ) )\r
+    {\r
+        char_idx = 0U;\r
+\r
+        /* Get the first data byte from the input buffer */\r
+        data_byte = (uint_fast8_t)p_sz_string[char_idx];\r
+\r
+        /* First check for the NULL terminator byte.\r
+         * Then remain in this loop until the entire string in the input buffer\r
+         * has been transferred to the UART.\r
+         */\r
+        while ( 0U != data_byte )\r
+        {\r
+            /* Wait until TX FIFO is empty. */\r
+            do {\r
+                status = HAL_get_8bit_reg( this_uart->base_address,LSR);\r
+                this_uart->status |= status;\r
+            } while ( !( status & LSR_THRE_MASK ) );\r
+\r
+            /* Send bytes from the input buffer until the TX FIFO is full\r
+             * or we reach the NULL terminator byte.\r
+             */\r
+            fill_size = 0U;\r
+            while ( (0U != data_byte) && (fill_size < TX_FIFO_SIZE) )\r
+            {\r
+                /* Send the data byte */\r
+                HAL_set_8bit_reg( this_uart->base_address, THR, data_byte );\r
+                ++fill_size;\r
+                char_idx++;\r
+                /* Get the next data byte from the input buffer */\r
+                data_byte = (uint_fast8_t)p_sz_string[char_idx];\r
+            }\r
+        }\r
+    }\r
+}\r
+\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_irq_tx.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+void\r
+UART_16550_irq_tx\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    const uint8_t * pbuff,\r
+    uint32_t tx_size\r
+)\r
+{\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    HAL_ASSERT( pbuff != NULL_BUFF )\r
+    HAL_ASSERT( tx_size > 0U )\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) &&\r
+        ( pbuff != NULL_BUFF ) &&\r
+        ( tx_size > 0U ) )\r
+    {\r
+        /*Initialize the UART instance with\r
+          parameters required for transmission.*/\r
+        this_uart->tx_buffer = pbuff;\r
+        this_uart->tx_buff_size = tx_size;\r
+        /* char_idx; */\r
+        this_uart->tx_idx = 0U;\r
+        /* assign handler for default data transmission */\r
+        this_uart->tx_handler = default_tx_handler;\r
+\r
+        /* enables TX interrupt */\r
+        HAL_set_8bit_reg_field(this_uart->base_address, IER_ETBEI, ENABLE);\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_tx_complete.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+int8_t\r
+UART_16550_tx_complete\r
+(\r
+    uart_16550_instance_t * this_uart\r
+)\r
+{\r
+    int8_t returnvalue = 0;\r
+    uint8_t status = 0U;\r
+\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+\r
+    if( this_uart != NULL_INSTANCE )\r
+    {\r
+        status = HAL_get_8bit_reg(this_uart->base_address,LSR);\r
+        this_uart->status |= status;\r
+\r
+        if( ( this_uart->tx_buff_size == TX_COMPLETE ) &&\r
+                             ( status & LSR_TEMT_MASK ) )\r
+        {\r
+            returnvalue = (int8_t)1;\r
+        }\r
+    }\r
+    return returnvalue;\r
+}\r
+\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_get_rx.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+size_t\r
+UART_16550_get_rx\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uint8_t * rx_buff,\r
+    size_t buff_size\r
+)\r
+{\r
+    uint8_t status;\r
+    size_t rx_size = 0U;\r
+\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    HAL_ASSERT( rx_buff != (uint8_t *)0 )\r
+    HAL_ASSERT( buff_size > 0U )\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) &&\r
+        ( rx_buff != (uint8_t *)0 ) &&\r
+        ( buff_size > 0U ) )\r
+    {\r
+        status = HAL_get_8bit_reg( this_uart->base_address, LSR );\r
+        this_uart->status |= status;\r
+        while ( ((status & LSR_DR_MASK) != 0U) && ( rx_size < buff_size ) )\r
+        {\r
+            rx_buff[rx_size] = HAL_get_8bit_reg( this_uart->base_address, RBR );\r
+            rx_size++;\r
+            status = HAL_get_8bit_reg( this_uart->base_address, LSR );\r
+            this_uart->status |= status;\r
+        }\r
+    }\r
+    return rx_size;\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_isr.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+void\r
+UART_16550_isr\r
+(\r
+    uart_16550_instance_t * this_uart\r
+)\r
+{\r
+    uint8_t iirf;\r
+\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+\r
+    if(this_uart != NULL_INSTANCE )\r
+    {\r
+        iirf = HAL_get_8bit_reg_field( this_uart->base_address, IIR_IIR );\r
+\r
+        switch ( iirf )\r
+        {\r
+            /* Modem status interrupt */\r
+            case IIRF_MODEM_STATUS:\r
+            {\r
+                if( INVALID_IRQ_HANDLER != this_uart->modemsts_handler  )\r
+                {\r
+                    HAL_ASSERT( INVALID_IRQ_HANDLER != this_uart->modemsts_handler );\r
+                    if( INVALID_IRQ_HANDLER != this_uart->modemsts_handler )\r
+                    {\r
+                        (*(this_uart->modemsts_handler))(this_uart);\r
+                    }\r
+                }\r
+            }\r
+            break;\r
+            /* Transmitter Holding Register Empty interrupt */\r
+            case IIRF_THRE:\r
+            {\r
+                HAL_ASSERT( INVALID_IRQ_HANDLER != this_uart->tx_handler );\r
+                if ( INVALID_IRQ_HANDLER != this_uart->tx_handler )\r
+                {\r
+                    (*(this_uart->tx_handler))(this_uart);\r
+                }\r
+            }\r
+            break;\r
+            /* Received Data Available interrupt */\r
+            case IIRF_RX_DATA:\r
+            case IIRF_DATA_TIMEOUT:\r
+            {\r
+                HAL_ASSERT( INVALID_IRQ_HANDLER != this_uart->rx_handler );\r
+                if ( INVALID_IRQ_HANDLER != this_uart->rx_handler )\r
+                {\r
+                    (*(this_uart->rx_handler))(this_uart);\r
+                }\r
+            }\r
+            break;\r
+            /* Line status interrupt */\r
+            case IIRF_RX_LINE_STATUS:\r
+            {\r
+                HAL_ASSERT( INVALID_IRQ_HANDLER != this_uart->linests_handler );\r
+                if ( INVALID_IRQ_HANDLER != this_uart->linests_handler )\r
+                {\r
+                    (*(this_uart->linests_handler))(this_uart);\r
+                }\r
+            }\r
+            break;\r
+            /* Unidentified interrupt */\r
+            default:\r
+            {\r
+                HAL_ASSERT( INVALID_INTERRUPT )\r
+            }\r
+        }\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_set_rx_handler.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+void\r
+UART_16550_set_rx_handler\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uart_16550_irq_handler_t handler,\r
+    uart_16550_rx_trig_level_t trigger_level\r
+)\r
+{\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    HAL_ASSERT( handler != INVALID_IRQ_HANDLER)\r
+    HAL_ASSERT( trigger_level < UART_16550_FIFO_INVALID_TRIG_LEVEL)\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) &&\r
+        ( handler != INVALID_IRQ_HANDLER) &&\r
+        ( trigger_level < UART_16550_FIFO_INVALID_TRIG_LEVEL) )\r
+    {\r
+        this_uart->rx_handler = handler;\r
+\r
+        /* Set the receive interrupt trigger level. */\r
+        HAL_set_8bit_reg_field( this_uart->base_address,\r
+                            FCR_TRIG_LEVEL, trigger_level );\r
+\r
+        /* Enable receive interrupt. */\r
+        HAL_set_8bit_reg_field( this_uart->base_address, IER_ERBFI, ENABLE );\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_set_loopback.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+void\r
+UART_16550_set_loopback\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uart_16550_loopback_t loopback\r
+)\r
+{\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE );\r
+    HAL_ASSERT( loopback < UART_16550_INVALID_LOOPBACK );\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) &&\r
+        ( loopback < UART_16550_INVALID_LOOPBACK ) )\r
+    {\r
+        if ( loopback == UART_16550_LOOPBACK_OFF )\r
+        {\r
+            HAL_set_8bit_reg_field( this_uart->base_address,\r
+                                    MCR_LOOP,\r
+                                    DISABLE );\r
+        }\r
+        else\r
+        {\r
+            HAL_set_8bit_reg_field( this_uart->base_address,\r
+                                    MCR_LOOP,\r
+                                    ENABLE );\r
+        }\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_get_rx_status.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+uint8_t\r
+UART_16550_get_rx_status\r
+(\r
+    uart_16550_instance_t * this_uart\r
+)\r
+{\r
+    uint8_t status = UART_16550_INVALID_PARAM;\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE );\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) )\r
+    {\r
+        /*\r
+         * Bit 1 - Overflow error status\r
+         * Bit 2 - Parity error status\r
+         * Bit 3 - Frame error status\r
+         * Bit 4 - Break interrupt indicator\r
+         * Bit 7 - FIFO data error status\r
+         */\r
+        this_uart->status |= HAL_get_8bit_reg( this_uart->base_address, LSR );\r
+        status = ( this_uart->status & STATUS_ERROR_MASK );\r
+        /*\r
+         * Clear the sticky status for this instance.\r
+         */\r
+        this_uart->status = (uint8_t)0;\r
+    }\r
+    return status;\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_get_modem_status.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+uint8_t\r
+UART_16550_get_modem_status\r
+(\r
+    uart_16550_instance_t * this_uart\r
+)\r
+{\r
+    uint8_t status = UART_16550_NO_ERROR;\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) )\r
+    {\r
+        /*\r
+         * Extract UART error status and place in lower bits of "status".\r
+         * Bit 0 - Delta Clear to Send Indicator\r
+         * Bit 1 - Delta Clear to Receive Indicator\r
+         * Bit 2 - Trailing edge of Ring Indicator detector\r
+         * Bit 3 - Delta Data Carrier Detect indicator\r
+         * Bit 4 - Clear To Send\r
+         * Bit 5 - Data Set Ready\r
+         * Bit 6 - Ring Indicator\r
+         * Bit 7 - Data Carrier Detect\r
+         */\r
+        status = HAL_get_8bit_reg( this_uart->base_address, MSR );\r
+    }\r
+    return status;\r
+}\r
+\r
+/***************************************************************************//**\r
+ * Default TX interrupt handler to automatically transmit data from\r
+ * user assgined TX buffer.\r
+ */\r
+static void\r
+default_tx_handler\r
+(\r
+    uart_16550_instance_t * this_uart\r
+)\r
+{\r
+    uint8_t status;\r
+\r
+    HAL_ASSERT( NULL_INSTANCE != this_uart )\r
+\r
+    if ( this_uart != NULL_INSTANCE )\r
+    {\r
+        HAL_ASSERT( NULL_BUFF != this_uart->tx_buffer )\r
+        HAL_ASSERT( 0U != this_uart->tx_buff_size )\r
+\r
+        if ( ( this_uart->tx_buffer != NULL_BUFF ) &&\r
+             ( 0U != this_uart->tx_buff_size ) )\r
+        {\r
+            /* Read the Line Status Register and update the sticky record. */\r
+            status = HAL_get_8bit_reg( this_uart->base_address,LSR);\r
+            this_uart->status |= status;\r
+    \r
+            /*\r
+             * This function should only be called as a result of a THRE interrupt.\r
+             * Verify that this is true before proceeding to transmit data.\r
+             */\r
+            if ( status & LSR_THRE_MASK )\r
+            {\r
+                uint32_t size_sent = 0U;\r
+                uint32_t fill_size = TX_FIFO_SIZE;\r
+                uint32_t tx_remain = this_uart->tx_buff_size - this_uart->tx_idx;\r
+    \r
+                /* Calculate the number of bytes to transmit. */\r
+                if ( tx_remain < TX_FIFO_SIZE )\r
+                {\r
+                    fill_size = tx_remain;\r
+                }\r
+    \r
+                /* Fill the TX FIFO with the calculated the number of bytes. */\r
+                for ( size_sent = 0U; size_sent < fill_size; ++size_sent )\r
+                {\r
+                    /* Send next character in the buffer. */\r
+                    HAL_set_8bit_reg( this_uart->base_address, THR,\r
+                            (uint_fast8_t)this_uart->tx_buffer[this_uart->tx_idx]);\r
+                    ++this_uart->tx_idx;\r
+                }\r
+            }\r
+    \r
+            /* Flag Tx as complete if all data has been pushed into the Tx FIFO. */\r
+            if ( this_uart->tx_idx == this_uart->tx_buff_size )\r
+            {\r
+                this_uart->tx_buff_size = TX_COMPLETE;\r
+                /* disables TX interrupt */\r
+                HAL_set_8bit_reg_field( this_uart->base_address,\r
+                                        IER_ETBEI, DISABLE);\r
+            }\r
+        }\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_enable_irq.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+void\r
+UART_16550_enable_irq\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uint8_t irq_mask\r
+)\r
+{\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+\r
+    if( this_uart != NULL_INSTANCE )\r
+    {\r
+        /* irq_mask encoding: 1- enable\r
+         * bit 0 - Receive Data Available Interrupt\r
+         * bit 1 - Transmitter Holding  Register Empty Interrupt\r
+         * bit 2 - Receiver Line Status Interrupt\r
+         * bit 3 - Modem Status Interrupt\r
+         */\r
+        /* read present interrupts for enabled ones*/\r
+        irq_mask |= HAL_get_8bit_reg( this_uart->base_address, IER );\r
+        /* Enable interrupts */\r
+        HAL_set_8bit_reg( this_uart->base_address, IER, irq_mask );\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_disable_irq.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+void\r
+UART_16550_disable_irq\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uint8_t irq_mask\r
+)\r
+{\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+\r
+    if( this_uart != NULL_INSTANCE )\r
+    {\r
+        /* irq_mask encoding:  1 - disable\r
+         * bit 0 - Receive Data Available Interrupt\r
+         * bit 1 - Transmitter Holding  Register Empty Interrupt\r
+         * bit 2 - Receiver Line Status Interrupt\r
+         * bit 3 - Modem Status Interrupt\r
+         */\r
+        /* read present interrupts for enabled ones */\r
+        irq_mask = (( (uint8_t)~irq_mask ) & \r
+                    HAL_get_8bit_reg( this_uart->base_address, IER ));\r
+        /* Disable interrupts */\r
+        HAL_set_8bit_reg( this_uart->base_address, IER, irq_mask );\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_set_rxstatus_handler.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+void\r
+UART_16550_set_rxstatus_handler\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uart_16550_irq_handler_t handler\r
+)\r
+{\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    HAL_ASSERT( handler != INVALID_IRQ_HANDLER)\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) &&\r
+        ( handler != INVALID_IRQ_HANDLER) )\r
+    {\r
+        this_uart->linests_handler = handler;\r
+        /* Enable receiver line status interrupt. */\r
+        HAL_set_8bit_reg_field( this_uart->base_address, IER_ELSI, ENABLE );\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_set_tx_handler.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+void\r
+UART_16550_set_tx_handler\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uart_16550_irq_handler_t handler\r
+)\r
+{\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    HAL_ASSERT( handler != INVALID_IRQ_HANDLER)\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) &&\r
+        ( handler != INVALID_IRQ_HANDLER) )\r
+    {\r
+        this_uart->tx_handler = handler;\r
+\r
+        /* Make TX buffer info invalid */\r
+        this_uart->tx_buffer = NULL_BUFF;\r
+        this_uart->tx_buff_size = 0U;\r
+\r
+        /* Enable transmitter holding register Empty interrupt. */\r
+        HAL_set_8bit_reg_field( this_uart->base_address, IER_ETBEI, ENABLE );\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_set_modemstatus_handler.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+void\r
+UART_16550_set_modemstatus_handler\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uart_16550_irq_handler_t handler\r
+)\r
+{\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    HAL_ASSERT( handler != INVALID_IRQ_HANDLER)\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) &&\r
+        ( handler != INVALID_IRQ_HANDLER) )\r
+    {\r
+        this_uart->modemsts_handler = handler;\r
+        /* Enable modem status interrupt. */\r
+        HAL_set_8bit_reg_field( this_uart->base_address, IER_EDSSI, ENABLE );\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_fill_tx_fifo.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+size_t\r
+UART_16550_fill_tx_fifo\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    const uint8_t * tx_buffer,\r
+    size_t tx_size\r
+)\r
+{\r
+    uint8_t status;\r
+    size_t size_sent = 0U;\r
+\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    HAL_ASSERT( tx_buffer != NULL_BUFF )\r
+    HAL_ASSERT( tx_size > 0U )\r
+\r
+    /* Fill the UART's Tx FIFO until the FIFO is full or the complete input\r
+     * buffer has been written. */\r
+    if( (this_uart != NULL_INSTANCE) &&\r
+        (tx_buffer != NULL_BUFF)   &&\r
+        (tx_size > 0U) )\r
+    {\r
+        /* Read the Line Status Register and update the sticky record. */\r
+        status = HAL_get_8bit_reg( this_uart->base_address, LSR );\r
+        this_uart->status |= status;\r
+\r
+        /* Check if TX FIFO is empty. */\r
+        if( status & LSR_THRE_MASK )\r
+        {\r
+            uint32_t fill_size = TX_FIFO_SIZE;\r
+\r
+            /* Calculate the number of bytes to transmit. */\r
+            if ( tx_size < TX_FIFO_SIZE )\r
+            {\r
+                fill_size = tx_size;\r
+            }\r
+\r
+            /* Fill the TX FIFO with the calculated the number of bytes. */\r
+            for ( size_sent = 0U; size_sent < fill_size; ++size_sent )\r
+            {\r
+                /* Send next character in the buffer. */\r
+                HAL_set_8bit_reg( this_uart->base_address, THR,\r
+                                  (uint_fast8_t)tx_buffer[size_sent]);\r
+            }\r
+        }\r
+    }\r
+    return size_sent;\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_16550_get_tx_status.\r
+ * See core_16550.h for details of how to use this function.\r
+ */\r
+uint8_t\r
+UART_16550_get_tx_status\r
+(\r
+    uart_16550_instance_t * this_uart\r
+)\r
+{\r
+    uint8_t status = UART_16550_TX_BUSY;\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE );\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) )\r
+    {\r
+        /* Read the Line Status Register and update the sticky record. */\r
+        status = HAL_get_8bit_reg( this_uart->base_address, LSR );\r
+        this_uart->status |= status;\r
+        /*\r
+         * Extract the transmit status bits from the UART's Line Status Register.\r
+         * Bit 5 - Transmitter Holding Register/FIFO Empty (THRE) status. (If = 1, TX FIFO is empty)\r
+         * Bit 6 - Transmitter Empty (TEMT) status. (If = 1, both TX FIFO and shift register are empty)\r
+         */\r
+        status &= ( LSR_THRE_MASK | LSR_TEMT_MASK );\r
+    }\r
+    return status;\r
+}\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/Core16550/core_16550.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/Core16550/core_16550.h
new file mode 100644 (file)
index 0000000..98b1f16
--- /dev/null
@@ -0,0 +1,1264 @@
+/*******************************************************************************\r
+ * (c) Copyright 2007-2015 Microsemi SoC Products Group. All rights reserved.\r
+ *\r
+ * This file contains the application programming interface for the Core16550\r
+ * bare metal driver.\r
+ *\r
+ * SVN $Revision: 7963 $\r
+ * SVN $Date: 2015-10-09 17:58:21 +0530 (Fri, 09 Oct 2015) $\r
+ */\r
+/*=========================================================================*//**\r
+  @mainpage Core16550 Bare Metal Driver.\r
+\r
+  @section intro_sec Introduction\r
+  The Core16550 is an implementation of the Universal Asynchronous\r
+  Receiver/Transmitter aimed at complete compliance to standard 16550 UART.\r
+  The Core16550 bare metal software driver is designed for use in systems\r
+  with no operating system.\r
+\r
+  The Core16550 driver provides functions for polled and interrupt driven\r
+  transmitting and receiving. It also provides functions for reading the\r
+  values from different status registers, enabling and disabling interrupts\r
+  at Core16550 level. The Core16550 driver is provided as C source code.\r
+\r
+  @section driver_configuration Driver Configuration\r
+  Your application software should configure the Core16550 driver through\r
+  calls to the UART_16550_init() function for each Core16550 instance in\r
+  the hardware design. The configuration parameters include the Core16550\r
+  hardware instance base address and other runtime parameters, such as baud\r
+  value, bit width, and parity.\r
+\r
+  No Core16550 hardware configuration parameters are needed by the driver,\r
+  apart from the Core16550 hardware instance base address. Hence, no\r
+  additional configuration files are required to use the driver.\r
+\r
+  @section theory_op Theory of Operation\r
+  The Core16550 software driver is designed to allow the control of multiple\r
+  instances of Core16550. Each instance of Core16550 in the hardware design\r
+  is associated with a single instance of the uart_16550_instance_t structure\r
+  in the software. You need to allocate memory for one unique\r
+  uart_16550_instance_t structure instance for each Core16550 hardware instance.\r
+  The contents of these data structures are initialized during calls to\r
+  function UART_16550_init(). A pointer to the structure is passed to\r
+  subsequent driver functions in order to identify the Core16550 hardware\r
+  instance you wish to perform the requested operation on.\r
+\r
+  Note:     Do not attempt to directly manipulate the content of\r
+  uart_16550_instance_t structures. This structure is only intended to be\r
+  modified by the driver function.\r
+\r
+  Initialization\r
+  The Core16550 driver is initialized through a call to the UART_16550_init()\r
+  function. This function takes the UART\92s configuration as parameters.\r
+  The UART_16550_init() function must be called before any other Core16550\r
+  driver functions can be called.\r
+\r
+  Polled Transmission and Reception\r
+  The driver can be used to transmit and receive data once initialized. Polled\r
+  operations where the driver constantly polls the state of the UART registers\r
+  in order to control data transmit or data receive are performed using these\r
+  functions:\r
+         \95  UART_16550_polled_tx()\r
+         \95  UART_16550_polled_tx_string\r
+         \95  UART_16550_fill_tx_fifo()\r
+         \95  UART_16550_get_rx()\r
+\r
+  Data is transmitted using the UART_16550_polled_tx() function. This function\r
+  is blocking, meaning that it will only return once the data passed to the\r
+  function has been sent to the Core16550 hardware. Data received by the\r
+  Core16550 hardware can be read by the UART_16550_get_rx() function.\r
+\r
+  The UART_16550_polled_tx_string() function is provided to transmit a NULL (\91\0\92)\r
+  terminated string in polled mode. This function is blocking, meaning that it\r
+  will only return once the data passed to the function has been sent to the\r
+  Core16550 hardware.\r
+\r
+  The UART_16550_fill_tx_fifo() function fills the Core16550 hardware transmit\r
+  FIFO with data from a buffer passed as a parameter and returns the number of\r
+  bytes transferred to the FIFO. If the transmit FIFO is not empty when the\r
+  UART_16550_fill_tx_fifo() function is called it returns immediately without\r
+  transferring any data to the FIFO.\r
+\r
+  Interrupt Driven Operations\r
+  The driver can also transmit or receive data under interrupt control, freeing\r
+  your application to perform other tasks until an interrupt occurs indicating\r
+  that the driver\92s attention is required. Interrupt controlled UART operations\r
+  are performed using these functions:\r
+        \95   UART_16550_isr()\r
+        \95   UART_16550_irq_tx()\r
+        \95   UART_16550_tx_complete()\r
+        \95   UART_16550_set_tx_handler()\r
+        \95   UART_16550_set_rx_handler()\r
+        \95   UART_16550_set_rxstatus_handler()\r
+        \95   UART_16550_set_modemstatus_handler()\r
+        \95   UART_16550_enable_irq()\r
+        \95   UART_16550_disable_irq()\r
+\r
+  Interrupt Handlers\r
+  The UART_16550_isr() function is the top level interrupt handler function for\r
+  the Core16550 driver. You must call it from the system level\r
+  (CoreInterrupt and NVIC level) interrupt service routine (ISR) assigned to the\r
+  interrupt triggered by the Core16550 INTR signal. The UART_16550_isr() function\r
+  identifies the source of the Core16550 interrupt and calls the corresponding\r
+  handler function previously registered with the driver through calls to the\r
+  UART_16550_set_rx_handler(), UART_16550_set_tx_handler(),\r
+  UART_16550_set_rxstatus_handler(), and UART_16550_set_modemstatus_handler()\r
+  functions. You are responsible for creating these lower level interrupt handlers\r
+  as part of your application program and registering them with the driver.\r
+  The UART_16550_enable_irq() and UART_16550_disable_irq() functions are used to\r
+  enable or disable the received line status, received data available/character\r
+  timeout, transmit holding register empty and modem status interrupts at the\r
+  Core16550 level.\r
+\r
+  Transmitting Data\r
+  Interrupt-driven transmit is initiated by a call to UART_16550_irq_tx(),\r
+  specifying the block of data to transmit. Your application is then free to\r
+  perform other tasks and inquire later whether transmit has completed by calling\r
+  the UART_16550_tx_complete() function. The UART_16550_irq_tx() function enables\r
+  the UART\92s transmit holding register empty (THRE) interrupt and then, when the\r
+  interrupt goes active, the driver\92s default THRE interrupt handler transfers\r
+  the data block to the UART until the entire block is transmitted.\r
+\r
+  Note:     You can use the UART_16550_set_tx_handler() function to assign an\r
+  alternative handler to the THRE interrupt. In this case, you must not use the\r
+  UART_16550_irq_tx() function to initiate the transmit, as this will re-assign\r
+  the driver\92s default THRE interrupt handler to the THRE interrupt. Instead,\r
+  your alternative THRE interrupt handler must include a call to the\r
+  UART_16550_fill_tx_fifo() function to transfer the data to the UART.\r
+\r
+  Receiving Data\r
+  Interrupt-driven receive is performed by first calling UART_16550_set_rx_handler()\r
+  to register a receive handler function that will be called by the driver whenever\r
+  receive data is available. You must provide this receive handler function which\r
+  must include a call to the UART_16550_get_rx() function to actually read the\r
+  received data.\r
+\r
+  UART Status\r
+  The function UART_16550_get_rx_status() is used to read the receiver error status.\r
+  This function returns the overrun, parity, framing, break, and FIFO error status\r
+  of the receiver.\r
+  The function UART_16550_get_tx_status() is used to read the transmitter status.\r
+  This function returns the transmit empty (TEMT) and transmit holding register\r
+  empty (THRE) status of the transmitter.\r
+  The function UART_16550_get_modem_status() is used to read the modem status flags.\r
+  This function returns the current value of the modem status register.\r
+\r
+  Loopback\r
+  The function UART_16550_set_loopback() is used to enable or disable loopback\r
+  between Tx and Rx lines internal to Core16550.\r
+*//*=========================================================================*/\r
+#ifndef __CORE_16550_H\r
+#define __CORE_16550_H 1\r
+\r
+#include "cpu_types.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/***************************************************************************//**\r
+ * Receiver Error Status\r
+ * The following defines are used to determine the UART receiver error type.\r
+ * These bit mask constants are used with the return value of the\r
+ * UART_16550_get_rx_status() function to find out if any errors occurred\r
+ * while receiving data.\r
+ */\r
+#define UART_16550_NO_ERROR         ( (uint8_t) 0x00 )\r
+#define UART_16550_OVERRUN_ERROR    ( (uint8_t) 0x02 )\r
+#define UART_16550_PARITY_ERROR     ( (uint8_t) 0x04 )\r
+#define UART_16550_FRAMING_ERROR    ( (uint8_t) 0x08 )\r
+#define UART_16550_BREAK_ERROR      ( (uint8_t) 0x10 )\r
+#define UART_16550_FIFO_ERROR       ( (uint8_t) 0x80 )\r
+#define UART_16550_INVALID_PARAM    ( (uint8_t) 0xFF )\r
+\r
+/***************************************************************************//**\r
+ * Modem Status\r
+ * The following defines are used to determine the modem status. These bit\r
+ * mask constants are used with the return value of the\r
+ * UART_16550_get_modem_status() function to find out the modem status of\r
+ * the UART.\r
+ */\r
+#define UART_16550_DCTS             ( (uint8_t) 0x01 )\r
+#define UART_16550_DDSR             ( (uint8_t) 0x02 )\r
+#define UART_16550_TERI             ( (uint8_t) 0x04 )\r
+#define UART_16550_DDCD             ( (uint8_t) 0x08 )\r
+#define UART_16550_CTS              ( (uint8_t) 0x10 )\r
+#define UART_16550_DSR              ( (uint8_t) 0x20 )\r
+#define UART_16550_RI               ( (uint8_t) 0x40 )\r
+#define UART_16550_DCD              ( (uint8_t) 0x80 )\r
+\r
+/***************************************************************************//**\r
+ * Transmitter Status\r
+ * The following definitions are used to determine the UART transmitter status.\r
+ * These bit mask constants are used with the return value of the\r
+ * UART_16550_get_tx_status() function to find out the status of the\r
+ * transmitter.\r
+ */\r
+#define UART_16550_TX_BUSY          ( (uint8_t) 0x00 )\r
+#define UART_16550_THRE             ( (uint8_t) 0x20 )\r
+#define UART_16550_TEMT             ( (uint8_t) 0x40 )\r
+\r
+/***************************************************************************//**\r
+ * Core16550 Interrupts\r
+ * The following defines are used to enable and disable Core16550 interrupts.\r
+ * They are used to build the value of the irq_mask parameter for the\r
+ * UART_16550_enable_irq() and UART_16550_disable_irq() functions. A bitwise\r
+ * OR of these constants is used to enable or disable multiple interrupts.\r
+ */\r
+#define UART_16550_RBF_IRQ          ( (uint8_t) 0x01 )\r
+#define UART_16550_TBE_IRQ          ( (uint8_t) 0x02 )\r
+#define UART_16550_LS_IRQ           ( (uint8_t) 0x04 )\r
+#define UART_16550_MS_IRQ           ( (uint8_t) 0x08 )\r
+\r
+/***************************************************************************//**\r
+ * Data Width\r
+ * The following defines are used to build the value of the UART_16550_init()\r
+ * function line_config parameter.\r
+ */\r
+#define UART_16550_DATA_5_BITS      ( (uint8_t) 0x00 )\r
+#define UART_16550_DATA_6_BITS      ( (uint8_t) 0x01 )\r
+#define UART_16550_DATA_7_BITS      ( (uint8_t) 0x02 )\r
+#define UART_16550_DATA_8_BITS      ( (uint8_t) 0x03 )\r
+\r
+/***************************************************************************//**\r
+ * Parity Control\r
+ * The following defines are used to build the value of the UART_16550_init()\r
+ * function line_config parameter.\r
+ */\r
+#define UART_16550_NO_PARITY            ( (uint8_t) 0x00 )\r
+#define UART_16550_ODD_PARITY           ( (uint8_t) 0x08 )\r
+#define UART_16550_EVEN_PARITY          ( (uint8_t) 0x18 )\r
+#define UART_16550_STICK_PARITY_1       ( (uint8_t) 0x28 )\r
+#define UART_16550_STICK_PARITY_0       ( (uint8_t) 0x38 )\r
+\r
+/***************************************************************************//**\r
+ * Number of Stop Bits\r
+ * The following defines are used to build the value of the UART_16550_init()\r
+ * function line_config parameter.\r
+ */\r
+#define UART_16550_ONE_STOP_BIT     ( (uint8_t) 0x00 )\r
+/*only when data bits is 5*/\r
+#define UART_16550_ONEHALF_STOP_BIT ( (uint8_t) 0x04 )\r
+/*only when data bits is not 5*/\r
+#define UART_16550_TWO_STOP_BITS    ( (uint8_t) 0x04 )\r
+\r
+/***************************************************************************//**\r
+  This enumeration specifies the receiver FIFO trigger level. This is the number\r
+  of bytes that must be received before the UART generates a receive data\r
+  available interrupt. It provides the allowed values for the\r
+  UART_16550_set_rx_handler() function\92s trigger_level parameter.\r
+ */\r
+typedef enum {\r
+    UART_16550_FIFO_SINGLE_BYTE    = 0,\r
+    UART_16550_FIFO_FOUR_BYTES     = 1,\r
+    UART_16550_FIFO_EIGHT_BYTES    = 2,\r
+    UART_16550_FIFO_FOURTEEN_BYTES = 3,\r
+    UART_16550_FIFO_INVALID_TRIG_LEVEL\r
+} uart_16550_rx_trig_level_t;\r
+\r
+/***************************************************************************//**\r
+  This enumeration specifies the Loopback configuration of the UART. It provides\r
+  the allowed values for the UART_16550_set_loopback() function\92s loopback\r
+  parameter.\r
+ */\r
+typedef enum {\r
+    UART_16550_LOOPBACK_OFF   = 0,\r
+    UART_16550_LOOPBACK_ON    = 1,\r
+    UART_16550_INVALID_LOOPBACK\r
+} uart_16550_loopback_t;\r
+\r
+/***************************************************************************//**\r
+  This is type definition for Core16550 instance. You need to create and\r
+  maintain a record of this type. This holds all data regarding the Core16550\r
+  instance.\r
+ */\r
+typedef struct uart_16550_instance uart_16550_instance_t;\r
+\r
+/***************************************************************************//**\r
+  This typedef specifies the function prototype for Core16550 interrupt handlers.\r
+  All interrupt handlers registered with the Core16550 driver must be of this\r
+  type. The interrupt handlers are registered with the driver through the\r
+  UART_16550_set_rx_handler(), UART_16550_set_tx_handler(),\r
+  UART_16550_set_rxstatus_handler(), and UART_16550_set_modemstatus_handler()\r
+  functions.\r
+\r
+  The this_uart parameter is a pointer to a uart_16550_instance_t structure that\r
+  holds all data regarding this instance of the Core16550.\r
+ */\r
+typedef void (*uart_16550_irq_handler_t)(uart_16550_instance_t * this_uart);\r
+\r
+/***************************************************************************//**\r
+  uart_16550_instance.\r
+  This structure is used to identify the various Core16550 hardware instances\r
+  in your system. Your application software should declare one instance of this\r
+  structure for each instance of Core16550 in your system. The function\r
+  UART_16550_init() initializes this structure. A pointer to an initialized\r
+  instance of the structure should be passed as the first parameter to the\r
+  Core16550 driver functions, to identify which Core16550 hardware instance\r
+  should perform the requested operation.\r
+ */\r
+struct uart_16550_instance{\r
+    /* Core16550 instance base address: */\r
+    addr_t      base_address;\r
+    /* Accumulated status: */\r
+    uint8_t     status;\r
+\r
+    /* transmit related info: */\r
+    const uint8_t*  tx_buffer;\r
+    uint32_t        tx_buff_size;\r
+    uint32_t        tx_idx;\r
+\r
+    /* line status (OE, PE, FE & BI) interrupt handler:*/\r
+    uart_16550_irq_handler_t linests_handler;\r
+    /* receive interrupt handler:*/\r
+    uart_16550_irq_handler_t rx_handler;\r
+    /* transmitter holding register interrupt handler:*/\r
+    uart_16550_irq_handler_t tx_handler;\r
+    /* modem status interrupt handler:*/\r
+    uart_16550_irq_handler_t modemsts_handler;\r
+};\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_init() function initializes the driver\92s data structures and\r
+ * the Core16550 hardware with the configuration passed as parameters.. The\r
+ * configuration parameters are the baud_value used to generate the baud rate,\r
+ * and the line_config used to specify the line configuration (bit length,\r
+ * stop bits and parity).\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550. This pointer\r
+ *                      is used to identify the target Core16550 hardware\r
+ *                      instance in subsequent calls to the Core16550 driver\r
+ *                      functions.\r
+ * @param base_addr     The base_address parameter is the base address in the\r
+ *                      processor's memory map for the registers of the\r
+ *                      Core16550 instance being initialized.\r
+ * @param baud_value    The baud_value parameter is used to select the baud rate\r
+ *                      for the UART. The baud value is calculated from the\r
+ *                      frequency of the system clock in Hertz and the desired\r
+ *                      baud rate using the following equation:\r
+ *\r
+ *                      baud_value = (clock /(baud_rate * 16))\r
+ *\r
+ *                      The baud_value parameter must be a value in the range 0\r
+ *                      to 65535 (or 0x0000 to 0xFFFF).\r
+ * @param line_config   This parameter is the line configuration specifying the\r
+ *                      bit length, number of stop bits and parity settings. This\r
+ *                      is a bitwise OR of one value from each of the following\r
+ *                      groups of allowed values:\r
+ *                      \95   Data lengths:\r
+ *                          UART_16550_DATA_5_BITS\r
+ *                          UART_16550_DATA_6_BITS\r
+ *                          UART_16550_DATA_7_BITS\r
+ *                          UART_16550_DATA_8_BITS\r
+ *                      \95   Parity types:\r
+ *                          UART_16550_NO_PARITY\r
+ *                          UART_16550_EVEN_PARITY\r
+ *                          UART_16550_ODD_PARITY\r
+ *                          UART_16550_STICK_PARITY_0\r
+ *                          UART_16550_STICK_PARITY_1\r
+ *                      \95   Number of stop bits:\r
+ *                          UART_16550_ONE_STOP_BIT\r
+ *                          UART_16550_ONEHALF_STOP_BIT\r
+ *                          UART_16550_TWO_STOP_BITS\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ * #define UART_16550_BASE_ADDR   0x2A000000\r
+ * #define BAUD_VALUE_57600    26\r
+ *\r
+ * uart_16550_instance_t g_uart;\r
+ *\r
+ * UART_16550_init( &g_uart, UART_16550_BASE_ADDR, BAUD_VALUE_57600,\r
+ *                  (UART_16550_DATA_8_BITS |\r
+ *                   UART_16550_EVEN_PARITY |\r
+ *                   UART_16550_ONE_STOP_BIT) );\r
+ * @endcode\r
+ */\r
+void\r
+UART_16550_init\r
+(\r
+    uart_16550_instance_t* this_uart,\r
+    addr_t base_addr,\r
+    uint16_t baud_value,\r
+    uint8_t line_config\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_polled_tx() function is used to transmit data. It transfers\r
+ * the contents of the transmitter data buffer, passed as a function parameter,\r
+ * into the UART's hardware transmitter FIFO. It returns when the full content\r
+ * of the transmitter data buffer has been transferred to the UART's transmitter\r
+ * FIFO. It is safe to release or reuse the memory used as the transmitter data\r
+ * buffer once this function returns.\r
+ *\r
+ * Note:    This function reads the UART\92s line status register (LSR) to poll\r
+ * for the active state of the transmitter holding register empty (THRE) bit\r
+ * before transferring data from the data buffer to the transmitter FIFO. It\r
+ * transfers data to the transmitter FIFO in blocks of 16 bytes or less and\r
+ * allows the FIFO to empty before transferring the next block of data.\r
+ *\r
+ * Note:    The actual transmission over the serial connection will still be in\r
+ * progress when this function returns. Use the UART_16550_get_tx_status()\r
+ * function if you need to know when the transmitter is empty.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all\r
+ *                      data regarding this instance of the Core16550.\r
+ * @param pbuff         The pbuff parameter is a pointer to a buffer containing\r
+ *                      the data to be transmitted.\r
+ * @param tx_size       The tx_size parameter is the size, in bytes, of the\r
+ *                      data to be transmitted.\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ *   uint8_t testmsg1[] = {"\n\r\n\r\n\rUART_16550_polled_tx() test message 1"};\r
+ *   UART_16550_polled_tx(&g_uart,(const uint8_t *)testmsg1,sizeof(testmsg1));\r
+ * @endcode\r
+ */\r
+void\r
+UART_16550_polled_tx\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    const uint8_t * pbuff,\r
+    uint32_t tx_size\r
+);\r
+/***************************************************************************//**\r
+ * The UART_16550_polled_tx_string() function is used to transmit a NULL ('\0')\r
+ * terminated string. It transfers the text string, from the buffer starting at\r
+ * the address pointed to by p_sz_string, into the UART\92s hardware transmitter\r
+ * FIFO. It returns when the complete string has been transferred to the UART's\r
+ * transmit FIFO. It is safe to release or reuse the memory used as the string\r
+ * buffer once this function returns.\r
+ *\r
+ * Note:    This function reads the UART\92s line status register (LSR) to poll\r
+ * for the active state of the transmitter holding register empty (THRE) bit\r
+ * before transferring data from the data buffer to the transmitter FIFO. It\r
+ * transfers data to the transmitter FIFO in blocks of 16 bytes or less and\r
+ * allows the FIFO to empty before transferring the next block of data.\r
+ *\r
+ * Note:    The actual transmission over the serial connection will still be\r
+ * in progress when this function returns. Use the UART_16550_get_tx_status()\r
+ * function if you need to know when the transmitter is empty.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @param p_sz_string   The p_sz_string parameter is a pointer to a buffer\r
+ *                      containing the NULL ('\0') terminated string to be\r
+ *                      transmitted.\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ *   uint8_t testmsg1[] = {"\r\n\r\nUART_16550_polled_tx_string() test message 1\0"};\r
+ *   UART_16550_polled_tx_string(&g_uart,(const uint8_t *)testmsg1);\r
+ * @endcode\r
+ */\r
+void\r
+UART_16550_polled_tx_string\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    const uint8_t * p_sz_string\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_irq_tx() function is used to initiate an interrupt driven\r
+ * transmit. It returns immediately after making a note of the transmit buffer\r
+ * location and enabling the transmitter holding register empty (THRE) interrupt\r
+ * at the Core16550 level. This function takes a pointer via the pbuff parameter\r
+ * to a memory buffer containing the data to transmit. The memory buffer\r
+ * specified through this pointer must remain allocated and contain the data to\r
+ * transmit until the transmit completion has been detected through calls to\r
+ * function UART_16550_tx_complete().The actual transmission over the serial\r
+ * connection is still in progress until calls to the UART_16550_tx_complete()\r
+ * function indicate transmit completion.\r
+ *\r
+ * Note:    It is your responsibility to call UART_16550_isr(), the driver\92s\r
+ * top level interrupt handler function, from the system level (CoreInterrupt\r
+ * and NVIC level) interrupt handler assigned to the interrupt triggered by the\r
+ * Core16550 INTR signal. You must do this before using the UART_16550_irq_tx()\r
+ * function.\r
+ *\r
+ * Note:    It is also your responsibility to enable the system level\r
+ * (CoreInterrupt and NVIC level) interrupt connected to the Core16550 INTR\r
+ * interrupt signal.\r
+ *\r
+ * Note:    The UART_16550_irq_tx() function assigns an internal default transmit\r
+ * interrupt handler function to the UART\92s THRE interrupt. This interrupt handler\r
+ * overrides any custom interrupt handler that you may have previously registered\r
+ * using the UART_16550_set_tx_handler() function.\r
+ *\r
+ * Note:    The UART_16550_irq_tx() function\92s default transmit interrupt handler\r
+ * disables the UART\92s THRE interrupt when all of the data has been transferred\r
+ * to the UART's transmit FIFO.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @param pbuff         The pbuff parameter is a pointer to a buffer containing\r
+ *                      the data to be transmitted.\r
+ * @param tx_size       The tx_size parameter specifies the size, in bytes, of\r
+ *                      the data to be transmitted.\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ * uint8_t tx_buff[10] = "abcdefghi";\r
+ *\r
+ * UART_16550_irq_tx( &g_uart, tx_buff, sizeof(tx_buff));\r
+ * while ( 0 == UART_16550_tx_complete( &g_uart ) )\r
+ * { ; }\r
+ * @endcode\r
+ */\r
+void\r
+UART_16550_irq_tx\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    const uint8_t * pbuff,\r
+    uint32_t tx_size\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_tx_complete() function is used to find out if the interrupt\r
+ * driven transmit previously initiated through a call to UART_16550_irq_tx()\r
+ * is complete. This function is typically used to find out when it is safe\r
+ * to reuse or release the memory buffer holding the transmit data.\r
+ *\r
+ * Note:    The transfer of all of the data from the memory buffer to the UART\92s\r
+ * transmit FIFO and the actual transmission over the serial connection are both\r
+ * complete when a call to the UART_16550_tx_complete() function indicate\r
+ * transmit completion.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @return              This function returns a non-zero value if transmit has\r
+ *                      completed, otherwise it returns zero.\r
+ *  Example:\r
+ *   See the UART_16550_irq_tx() function for an example that uses the\r
+ *   UART_16550_tx_complete() function.\r
+ */\r
+int8_t\r
+UART_16550_tx_complete\r
+(\r
+   uart_16550_instance_t * this_uart\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_get_rx() function reads the content of the Core16550\r
+ * receiver\92s FIFO and stores it in the receive buffer that is passed via the\r
+ * rx_buff function parameter. It copies either the full contents of the FIFO\r
+ * into the receive buffer, or just enough data from the FIFO to fill the receive\r
+ * buffer, dependent upon the size of the receive buffer passed by the buff_size\r
+ * parameter. The UART_16550_get_rx() function returns the number of bytes copied\r
+ * into the receive buffer .This function is non-blocking and will return 0\r
+ * immediately if no data has been received.\r
+ *\r
+ * Note:    The UART_16550_get_rx() function reads and accumulates the receiver\r
+ * status of the Core16550 instance before reading each byte from the receiver's\r
+ * data register/FIFO. This allows the driver to maintain a sticky record of any\r
+ * receiver errors that occur as the UART receives each data byte; receiver errors\r
+ * would otherwise be lost after each read from the receiver's data register. A call\r
+ * to the UART_16550_get_rx_status() function returns any receiver errors accumulated\r
+ * during the execution of the UART_16550_get_rx() function.\r
+ *\r
+ * Note:    If you need to read the error status for each byte received, set the\r
+ * buff_size to 1 and read the receive line error status for each byte using the\r
+ * UART_16550_get_rx_status() function.\r
+ * The UART_16550_get_rx() function can be used in polled mode, where it is called\r
+ * at regular intervals to find out if any data has been received, or in interrupt\r
+ * driven-mode, where it is called as part of a receive handler that is called by\r
+ * the driver as a result of data being received.\r
+ *\r
+ * Note:    In interrupt driven mode you should call the UART_16550_get_rx()\r
+ * function as part of the receive handler function that you register with the\r
+ * Core16550 driver through a call to UART_16550_set_rx_handler().\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @param rx_buff       The rx_buff parameter is a pointer to a memory buffer\r
+ *                      where the received data is copied.\r
+ * @param buff_size     The buff_size parameter is the size of the receive\r
+ *                      buffer in bytes.\r
+ * @return              This function returns the number of bytes copied into\r
+ *                      the receive buffer.\r
+ * Example:\r
+ * @code\r
+ *   #define MAX_RX_DATA_SIZE    256\r
+ *\r
+ *   uint8_t rx_data[MAX_RX_DATA_SIZE];\r
+ *   uint8_t rx_size = 0;\r
+ *\r
+ *   rx_size = UART_16550_get_rx( &g_uart, rx_data, sizeof(rx_data) );\r
+ * @endcode\r
+ */\r
+size_t\r
+UART_16550_get_rx\r
+(\r
+   uart_16550_instance_t * this_uart,\r
+   uint8_t * rx_buff,\r
+   size_t buff_size\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_isr() function is the top level interrupt handler function for\r
+ * the Core16550 driver. You must call UART_16550_isr() from the system level\r
+ * (CoreInterrupt and NVIC level) interrupt handler assigned to the interrupt\r
+ * triggered by the Core16550 INTR signal. Your system level interrupt handler\r
+ * must also clear the system level interrupt triggered by the Core16550 INTR\r
+ * signal before returning, to prevent a re-assertion of the same interrupt.\r
+ *\r
+ * Note:    This function supports all types of interrupt triggered by Core16550.\r
+ * It is not a complete interrupt handler by itself; rather, it is a top level\r
+ * wrapper that abstracts Core16550 interrupt handling by calling lower level\r
+ * handler functions specific to each type of Core16550 interrupt. You must\r
+ * create the lower level handler functions to suit your application and\r
+ * register them with the driver through calls to the UART_16550_set_rx_handler(),\r
+ * UART_16550_set_tx_handler(), UART_16550_set_rxstatus_handler() and\r
+ * UART_16550_set_modemstatus_handler() functions.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ *\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ *   void CIC_irq1_handler(void)\r
+ *   {\r
+ *      UART_16550_isr( &g_uart );\r
+ *   }\r
+ * @endcode\r
+ */\r
+void\r
+UART_16550_isr\r
+(\r
+   uart_16550_instance_t * this_uart\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_set_rx_handler() function is used to register a receive handler\r
+ * function that is called by the driver when a UART receive data available (RDA)\r
+ * interrupt occurs. The UART_16550_set_rx_handler() function also enables the\r
+ * RDA interrupt at the Core16550 level. You must create and register the receive\r
+ * handler function to suit your application and it must include a call to the\r
+ * UART_16550_get_rx() function to actually read the received data.\r
+ *\r
+ * Note:    The driver\92s top level interrupt handler function UART_16550_isr()\r
+ * will call your receive handler function in response to an RDA interrupt from\r
+ * the Core16550.\r
+ *\r
+ * Note:    You can disable the RDA interrupt once the data is received by calling\r
+ * the UART_16550_disable_irq() function. This is your choice and is dependent\r
+ * upon your application.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @param handler       The handler parameter is a pointer to a receive interrupt\r
+ *                      handler function provided by your application that will be\r
+ *                      called as a result of a UART RDA interrupt. This handler\r
+ *                      function must be of type uart_16550_irq_handler_t.\r
+ * @param trigger_level The trigger_level parameter is the receive FIFO\r
+ *                      trigger level. This specifies the number of bytes that\r
+ *                      must be received before the UART triggers an RDA\r
+ *                      interrupt.\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ * #include "core_16550.h"\r
+ *\r
+ * #define RX_BUFF_SIZE    64\r
+ * #define UART_57600_BAUD 26\r
+ *\r
+ * uint8_t g_rx_buff[RX_BUFF_SIZE];\r
+ * uart_16550_instance_t g_uart;\r
+ * void uart_rx_handler( uart_16550_instance_t * this_uart )\r
+ * {\r
+ *     UART_16550_get_rx( this_uart, g_rx_buff, RX_BUFF_SIZE );\r
+ * }\r
+ *\r
+ * int main(void)\r
+ * {\r
+ *     UART_16550_init( &g_uart, UART_57600_BAUD,\r
+ *                       ( UART_16550_DATA_8_BITS | UART_16550_NO_PARITY ) );\r
+ *     UART_16550_set_rx_handler( &g_uart, uart_rx_handler,\r
+ *                                UART_16550_FIFO_SINGLE_BYTE);\r
+ *     while ( 1 )\r
+ *     {\r
+ *         ;\r
+ *     }\r
+ *     return(0);\r
+ * }\r
+ * @endcode\r
+ */\r
+void\r
+UART_16550_set_rx_handler\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uart_16550_irq_handler_t handler,\r
+    uart_16550_rx_trig_level_t trigger_level\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_set_loopback() function is used to locally loopback the Tx\r
+ * and Rx lines of a Core16550 UART.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @param loopback      The loopback parameter indicates whether or not the\r
+ *                      UART's transmit and receive lines should be looped back.\r
+ *                      Allowed values are as follows:\r
+ *                      \95   UART_16550_LOOPBACK_ON\r
+ *                      \95   UART_16550_LOOPBACK_OFF\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ * #include "core_16550.h"\r
+ *\r
+ * #define UART_57600_BAUD 26\r
+ * #define DATA_SIZE 4\r
+ *\r
+ * uart_16550_instance_t g_uart;\r
+ *\r
+ * int main(void)\r
+ * {\r
+ *      uint8_t txbuf[DATA_SIZE] = "abc";\r
+ *      uint8_t rxbuf[DATA_SIZE];\r
+ *      UART_16550_init( &g_uart, UART_57600_BAUD,\r
+ *                        ( UART_16550_DATA_8_BITS | UART_16550_NO_PARITY |\r
+ *                                               UART_16550_ONE_STOP_BIT) );\r
+ *      UART_16550_set_loopback( &g_uart, UART_16550_LOOPBACK_ON );\r
+ *\r
+ *      while(1)\r
+ *      {\r
+ *          UART_16550_polled_tx( &g_uart, txbuf, DATA_SIZE);\r
+ *          delay(100);\r
+ *          UART_16550_get_rx( &g_uart, rxbuf, DATA_SIZE);\r
+ *      }\r
+ * }\r
+ * @endcode\r
+ */\r
+void\r
+UART_16550_set_loopback\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uart_16550_loopback_t loopback\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_get_rx_status() function returns the receiver error status of\r
+ * the Core16550 instance. It reads both the current error status of the receiver\r
+ * from the UART\92s line status register (LSR) and the accumulated error status\r
+ * from preceding calls to the UART_16550_get_rx() function, and it combines\r
+ * them using a bitwise OR. It returns the cumulative overrun, parity, framing,\r
+ * break and FIFO error status of the receiver, since the previous call to\r
+ * UART_16550_get_rx_status(), as an 8-bit encoded value.\r
+ *\r
+ * Note:    The UART_16550_get_rx() function reads and accumulates the receiver\r
+ * status of the Core16550 instance before reading each byte from the receiver\92s\r
+ * data register/FIFO. The driver maintains a sticky record of the cumulative\r
+ * receiver error status, which persists after the UART_16550_get_rx() function\r
+ * returns. The UART_16550_get_rx_status() function clears the driver\92s sticky\r
+ * receiver error record before returning.\r
+ *\r
+ * Note:    The driver\92s transmit functions also read the line status register\r
+ * (LSR) as part of their implementation. When the driver reads the LSR, the\r
+ * UART clears any active receiver error bits in the LSR. This could result in\r
+ * the driver losing receiver errors. To avoid any loss of receiver errors, the\r
+ * transmit functions also update the driver\92s sticky record of the cumulative\r
+ * receiver error status whenever they read the LSR.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @return              This function returns the UART\92s receiver error status\r
+ *                      as an 8-bit unsigned integer. The returned value is 0\r
+ *                      if no receiver errors occurred. The driver provides a\r
+ *                      set of bit mask constants that should be compared with\r
+ *                      and/or used to mask the returned value to determine the\r
+ *                      receiver error status.\r
+ *                      When the return value is compared to the following bit\r
+ *                      masks, a non-zero result indicates that the\r
+ *                      corresponding error occurred:\r
+ *                      \95   UART_16550_OVERRUN_ERROR    (bit mask = 0x02)\r
+ *                      \95   UART_16550_PARITY_ERROR     (bit mask = 0x04)\r
+ *                      \95   UART_16550_FRAMING_ERROR    (bit mask = 0x08)\r
+ *                      \95   UART_16550_BREAK_ERROR      (bit mask = 0x10)\r
+ *                      \95   UART_16550_FIFO_ERROR       (bit mask = 0x80)\r
+ *                      When the return value is compared to the following bit\r
+ *                      mask, a non-zero result indicates that no error occurred:\r
+ *                      \95   UART_16550_NO_ERROR         (bit mask = 0x00)\r
+ *                      Upon unsuccessful execution, this function returns:\r
+ *                      \95   UART_16550_INVALID_PARAM    (bit mask = 0xFF)\r
+ *\r
+ * Example:\r
+ * @code\r
+ *   uart_16550_instance_t g_uart;\r
+ *   uint8_t rx_data[MAX_RX_DATA_SIZE];\r
+ *   uint8_t err_status;\r
+ *\r
+ *   err_status = UART_16550_get_rx_status(&g_uart);\r
+ *   if(UART_16550_NO_ERROR == err_status )\r
+ *   {\r
+ *        rx_size = UART_16550_get_rx( &g_uart, rx_data, MAX_RX_DATA_SIZE );\r
+ *   }\r
+ * @endcode\r
+ */\r
+uint8_t\r
+UART_16550_get_rx_status\r
+(\r
+    uart_16550_instance_t * this_uart\r
+);\r
+/***************************************************************************//**\r
+ * The UART_16550_enable_irq() function enables the Core16550 interrupts\r
+ * specified by the irq_mask parameter. The irq_mask parameter identifies the\r
+ * Core16550 interrupts by bit position, as defined in the interrupt enable\r
+ * register (IER) of Core16550. The Core16550 interrupts and their identifying\r
+ * irq_mask bit positions are as follows:\r
+ *      \95   Receive data available interrupt (RDA)      (irq_mask bit 0)\r
+ *      \95   Transmit holding register empty interrupt (THRE)    (irq_mask bit 1)\r
+ *      \95   Receiver line status interrupt (LS)         (irq_mask bit 2)\r
+ *      \95   Modem status interrupt (MS)         (irq_mask bit 3)\r
+ * When an irq_mask bit position is set to 1, this function enables the\r
+ * corresponding Core16550 interrupt in the IER register. When an irq_mask\r
+ * bit position is set to 0, the corresponding interrupt\92s state remains\r
+ * unchanged in the IER register.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @param irq_mask      The irq_mask parameter is used to select which of the\r
+ *                      Core16550\92s interrupts you want to enable. The allowed\r
+ *                      value for the irq_mask parameter is one of the\r
+ *                      following constants or a bitwise OR of more than one:\r
+ *                      \95   UART_16550_RBF_IRQ      (bit mask = 0x01)\r
+ *                      \95   UART_16550_TBE_IRQ      (bit mask = 0x02)\r
+ *                      \95   UART_16550_LS_IRQ       (bit mask = 0x04)\r
+ *                      \95   UART_16550_MS_IRQ       (bit mask = 0x08)\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ *   UART_16550_enable_irq( &g_uart,( UART_16550_RBF_IRQ | UART_16550_TBE_IRQ ) );\r
+ * @endcode\r
+ */\r
+void\r
+UART_16550_enable_irq\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uint8_t irq_mask\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_disable_irq() function disables the Core16550 interrupts\r
+ * specified by the irq_mask parameter. The irq_mask parameter identifies the\r
+ * Core16550 interrupts by bit position, as defined in the interrupt enable\r
+ * register (IER) of Core16550. The Core16550 interrupts and their identifying\r
+ * bit positions are as follows:\r
+ *      \95   Receive data available interrupt (RDA)              (irq_mask bit 0)\r
+ *      \95   Transmit holding register empty interrupt (THRE)    (irq_mask bit 1)\r
+ *      \95   Receiver line status interrupt (LS)                 (irq_mask bit 2)\r
+ *      \95   Modem status interrupt (MS)                         (irq_mask bit 3)\r
+ * When an irq_mask bit position is set to 1, this function disables the\r
+ * corresponding Core16550 interrupt in the IER register. When an irq_mask bit\r
+ * position is set to 0, the corresponding interrupt\92s state remains unchanged\r
+ * in the IER register.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @param irq_mask      The irq_mask parameter is used to select which of the\r
+ *                      Core16550\92s interrupts you want to disable. The allowed\r
+ *                      value for the irq_mask parameter is one of the\r
+ *                      following constants or a bitwise OR of more than one:\r
+ *                      \95   UART_16550_RBF_IRQ      (bit mask = 0x01)\r
+ *                      \95   UART_16550_TBE_IRQ      (bit mask = 0x02)\r
+ *                      \95   UART_16550_LS_IRQ       (bit mask = 0x04)\r
+ *                      \95   UART_16550_MS_IRQ       (bit mask = 0x08)\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ *   UART_16550_disable_irq( &g_uart, ( UART_16550_RBF_IRQ | UART_16550_TBE_IRQ ) );\r
+ * @endcode\r
+ */\r
+void\r
+UART_16550_disable_irq\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uint8_t irq_mask\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_get_modem_status() function returns the modem status of the\r
+ * Core16550 instance. It reads the modem status register (MSR) and returns the\r
+ * 8 bit value. The bit encoding of the returned value is exactly the same as\r
+ * the definition of the bits in the MSR.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @return              This function returns current state of the UART's MSR\r
+ *                      as an 8 bit unsigned integer. The driver provides the\r
+ *                      following set of bit mask constants that should be\r
+ *                      compared with and/or used to mask the returned value\r
+ *                      to determine the modem status:\r
+ *                      \95   UART_16550_DCTS (bit mask = 0x01)\r
+ *                      \95   UART_16550_DDSR (bit mask = 0x02)\r
+ *                      \95   UART_16550_TERI (bit mask = 0x04)\r
+ *                      \95   UART_16550_DDCD (bit mask = 0x08)\r
+ *                      \95   UART_16550_CTS  (bit mask = 0x10)\r
+ *                      \95   UART_16550_DSR  (bit mask = 0x20)\r
+ *                      \95   UART_16550_RI   (bit mask = 0x40)\r
+ *                      \95   UART_16550_DCD  (bit mask = 0x80)\r
+ * Example:\r
+ * @code\r
+ *   void uart_modem_status_isr(uart_16550_instance_t * this_uart)\r
+ *   {\r
+ *      uint8_t status;\r
+ *      status = UART_16550_get_modem_status( this_uart );\r
+ *      if( status & UART_16550_DCTS )\r
+ *      {\r
+ *          uart_dcts_handler();\r
+ *      }\r
+ *      if( status & UART_16550_CTS )\r
+ *      {\r
+ *          uart_cts_handler();\r
+ *      }\r
+ *   }\r
+ * @endcode\r
+ */\r
+uint8_t\r
+UART_16550_get_modem_status\r
+(\r
+    uart_16550_instance_t * this_uart\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_set_rxstatus_handler() function is used to register a receiver\r
+ * status handler function that is called by the driver when a UART receiver\r
+ * line status (RLS) interrupt occurs. The UART_16550_set_rxstatus_handler()\r
+ * function also enables the RLS interrupt at the Core16550 level. You must\r
+ * create and register the receiver status handler function to suit your\r
+ * application.\r
+ *\r
+ * Note:    The driver\92s top level interrupt handler function UART_16550_isr()\r
+ * will call your receive status handler function in response to an RLS\r
+ * interrupt from the Core16550.\r
+ *\r
+ * Note:    You can disable the RLS interrupt when required by calling the\r
+ * UART_16550_disable_irq() function. This is your choice and is dependent\r
+ * upon your application.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @param handler       The handler parameter is a pointer to a receiver line\r
+ *                      status interrupt handler function provided by your\r
+ *                      application that will be called as a result of a\r
+ *                      UART RLS interrupt. This handler function must be\r
+ *                      of type uart_16550_irq_handler_t.\r
+ * Example:\r
+ * @code\r
+ * #include "core_16550.h"\r
+ *\r
+ * #define UART_57600_BAUD 26\r
+ *\r
+ * uart_16550_instance_t g_uart;\r
+ *\r
+ * void uart_rxsts_handler( uart_16550_instance_t * this_uart )\r
+ * {\r
+ *      uint8_t status;\r
+ *      status = UART_16550_get_rx_status( this_uart );\r
+ *      if( status & UART_16550_OVERUN_ERROR )\r
+ *      {\r
+ *          discard_rx_data();\r
+ *      }\r
+ * }\r
+ *\r
+ * int main(void)\r
+ * {\r
+ *     UART_16550_init( &g_uart, UART_57600_BAUD,\r
+ *                      UART_16550_DATA_8_BITS | UART_16550_NO_PARITY |\r
+ *                                             UART_16550_ONE_STOP_BIT );\r
+ *     UART_16550_set_rxstatus_handler( &g_uart, uart_rxsts_handler );\r
+ *\r
+ *     while ( 1 )\r
+ *     {\r
+ *         ;\r
+ *     }\r
+ *     return(0);\r
+ * }\r
+ * @endcode\r
+ */\r
+void\r
+UART_16550_set_rxstatus_handler\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uart_16550_irq_handler_t handler\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_set_tx_handler() function is used to register a transmit\r
+ * handler function that is called by the driver when a UART transmit holding\r
+ * register empty (THRE) interrupt occurs. The UART_16550_set_tx_handler()\r
+ * function also enables the THRE interrupt at the Core16550 level. You must\r
+ * create and register the transmit handler function to suit your application.\r
+ * You can use the UART_16550_fill_tx_fifo() function in your transmit handler\r
+ * function to write data to the transmitter.\r
+ *\r
+ * Note:    The driver\92s top level interrupt handler function UART_16550_isr()\r
+ * will call your transmit handler function in response to an THRE interrupt\r
+ * from the Core16550.\r
+ *\r
+ * Note:    You can disable the THRE interrupt when required by calling the\r
+ * UART_16550_disable_irq() function. This is your choice and is dependent\r
+ * upon your application.\r
+ *\r
+ * Note:    The UART_16550_irq_tx() function does not use the transmit handler\r
+ * function that you register with the UART_16550_set_tx_handler() function.\r
+ * It uses its own internal THRE interrupt handler function that overrides any\r
+ * custom interrupt handler that you register using the\r
+ * UART_16550_set_tx_handler() function.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @param handler       The handler parameter is a pointer to a transmitter\r
+ *                      interrupt handler function provided by your application,\r
+ *                      which will be called as a result of a UART THRE interrupt.\r
+ *                      This handler is of uart_16550_irq_handler_t type.\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ * #include "core_16550.h"\r
+ *\r
+ * #define UART_57600_BAUD 26\r
+ *\r
+ * uart_16550_instance_t g_uart;\r
+ *\r
+ * uint8_t * g_tx_buffer;\r
+ * size_t g_tx_size = 0;\r
+ *\r
+ * void uart_tx_handler( uart_16550_instance_t * this_uart )\r
+ * {\r
+ *      size_t size_in_fifo;\r
+ *\r
+ *      size_in_fifo = UART_16550_fill_tx_fifo( this_uart,\r
+ *                                              (const uint8_t *)g_tx_buffer,\r
+ *                                              g_tx_size );\r
+ *\r
+ *      if(size_in_fifo == g_tx_size)\r
+ *      {\r
+ *         g_tx_size = 0;\r
+ *         UART_16550_disable_irq( this_uart, UART_16550_TBE_IRQ );\r
+ *      }\r
+ *      else\r
+ *      {\r
+ *         g_tx_buffer = &g_tx_buffer[size_in_fifo];\r
+ *         g_tx_size = g_tx_size - size_in_fifo;\r
+ *      }\r
+ *  }\r
+ *\r
+ *  int main(void)\r
+ *  {\r
+ *      uint8_t message[12] = "Hello world";\r
+ *\r
+ *      UART_16550_init( &g_uart, UART_57600_BAUD,\r
+ *                       UART_16550_DATA_8_BITS | UART_16550_NO_PARITY |\r
+ *                                            UART_16550_ONE_STOP_BIT );\r
+ *\r
+ *      g_tx_buffer = message;\r
+ *      g_tx_size = sizeof(message);\r
+ *\r
+ *      UART_16550_set_tx_handler( &g_uart, uart_tx_handler);\r
+ *\r
+ *      while ( 1 )\r
+ *      {\r
+ *          ;\r
+ *      }\r
+ *      return(0);\r
+ *  }\r
+ *\r
+ * @endcode\r
+ */\r
+void\r
+UART_16550_set_tx_handler\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uart_16550_irq_handler_t handler\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_set_modemstatus_handler() function is used to register a\r
+ * modem status handler function that is called by the driver when a UART modem\r
+ * status (MS) interrupt occurs. The UART_16550_set_modemstatus_handler()\r
+ * function also enables the MS interrupt at the Core16550 level. You must\r
+ * create and register the modem status handler function to suit your\r
+ * application.\r
+ *\r
+ * Note:    The driver\92s top level interrupt handler function UART_16550_isr()\r
+ * will call your receive status handler function in response to an MS interrupt\r
+ * from the Core16550.\r
+ *\r
+ * Note:    You can disable the MS interrupt when required by calling the\r
+ * UART_16550_disable_irq() function. This is your choice and is dependent\r
+ * upon your application.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @param handler       The handler parameter is a pointer to a modem status\r
+ *                      interrupt handler function provided by your application\r
+ *                      that will be called as a result of a UART MS interrupt.\r
+ *                      This handler function must be of type\r
+ *                      uart_16550_irq_handler_t.\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ * #include "core_16550.h"\r
+ *\r
+ * #define UART_57600_BAUD 26\r
+ *\r
+ * uart_16550_instance_t g_uart;\r
+ *\r
+ * void uart_modem_handler( uart_16550_instance_t * this_uart )\r
+ * {\r
+ *      uint8_t status;\r
+ *      status = UART_16550_get_modem_status( this_uart );\r
+ *      if( status & UART_16550_CTS )\r
+ *      {\r
+ *          uart_cts_handler();\r
+ *      }\r
+ * }\r
+ *\r
+ * int main(void)\r
+ * {\r
+ *     UART_16550_init( &g_uart, UART_57600_BAUD,\r
+ *                      UART_16550_DATA_8_BITS | UART_16550_NO_PARITY |\r
+                                              UART_16550_ONE_STOP_BIT);\r
+ *     UART_16550_set_modemstatus_handler( &g_uart, uart_modem_handler);\r
+ *\r
+ *     while ( 1 )\r
+ *     {\r
+ *         ;\r
+ *     }\r
+ *     return(0);\r
+ * }\r
+ * @endcode\r
+ */\r
+void\r
+UART_16550_set_modemstatus_handler\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    uart_16550_irq_handler_t handler\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_fill_tx_fifo() function fills the UART's hardware transmitter\r
+ * FIFO with the data found in the transmitter buffer that is passed via the\r
+ * tx_buffer function parameter. If the transmitter FIFO is not empty when the\r
+ * function is called, the function returns immediately without transferring\r
+ * any data to the FIFO; otherwise, the function transfers data from the\r
+ * transmitter buffer to the FIFO until it is full or until the complete\r
+ * contents of the transmitter buffer have been copied into the FIFO. The\r
+ * function returns the number of bytes copied into the UART's transmitter FIFO.\r
+ *\r
+ * Note:    This function reads the UART\92s line status register (LSR) to check\r
+ * for the active state of the transmitter holding register empty (THRE) bit\r
+ * before transferring data from the data buffer to the transmitter FIFO. If\r
+ * THRE is 0, the function returns immediately, without transferring any data\r
+ * to the FIFO. If THRE is 1, the function transfers up to 16 bytes of data to\r
+ * the FIFO and then returns.\r
+ *\r
+ * Note:    The actual transmission over the serial connection will still be in\r
+ * progress when this function returns. Use the UART_16550_get_tx_status()\r
+ * function if you need to know when the transmitter is empty.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @param tx_buffer     The tx_buffer parameter is a pointer to a buffer\r
+ *                      containing the data to be transmitted.\r
+ * @param tx_size       The tx_size parameter is the size in bytes, of the data\r
+ *                      to be transmitted.\r
+ * @return              This function returns the number of bytes copied\r
+ *                      into the UART's transmitter FIFO.\r
+ *\r
+ * Example:\r
+ * @code\r
+ *   void send_using_interrupt(uint8_t * pbuff, size_t tx_size)\r
+ *   {\r
+ *       size_t size_in_fifo;\r
+ *       size_in_fifo = UART_16550_fill_tx_fifo( &g_uart, pbuff, tx_size );\r
+ *   }\r
+ * @endcode\r
+ */\r
+size_t\r
+UART_16550_fill_tx_fifo\r
+(\r
+    uart_16550_instance_t * this_uart,\r
+    const uint8_t * tx_buffer,\r
+    size_t tx_size\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_16550_get_tx_status() function returns the transmitter status of\r
+ * the Core16550 instance. It reads both the UART\92s line status register (LSR)\r
+ * and returns the status of the transmit holding register empty (THRE) and\r
+ * transmitter empty (TEMT) bits.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a\r
+ *                      uart_16550_instance_t structure that holds all data\r
+ *                      regarding this instance of the Core16550.\r
+ * @return              This function returns the UART\92s transmitter status\r
+ *                      as an 8-bit unsigned integer. The returned value is 0\r
+ *                      if the transmitter status bits are not set or the\r
+ *                      function execution failed. The driver provides a set\r
+ *                      of bit mask constants that should be compared with\r
+ *                      and/or used to mask the returned value to determine\r
+ *                      the transmitter status.\r
+ *                      When the return value is compared to the following\r
+ *                      bitmasks, a non-zero result indicates that the\r
+ *                      corresponding transmitter status bit is set:\r
+ *                      \95   UART_16550_THRE     (bit mask = 0x20)\r
+ *                      \95   UART_16550_TEMT     (bit mask = 0x40)\r
+ *                      When the return value is compared to the following\r
+ *                      bit mask, a non-zero result indicates that the\r
+ *                      transmitter is busy or the function execution failed.\r
+ *                      \95   UART_16550_TX_BUSY      (bit mask = 0x00)\r
+ * Example:\r
+ * @code\r
+ *   uint8_t tx_buff[10] = "abcdefghi";\r
+ *\r
+ *   UART_16550_polled_tx( &g_uart, tx_buff, sizeof(tx_buff));\r
+ *\r
+ *   while ( ! (UART_16550_TEMT & UART_16550_get_tx_status( &g_uart ) )  )\r
+ *   {\r
+ *      ;\r
+ *   }\r
+ * @endcode\r
+ */\r
+uint8_t\r
+UART_16550_get_tx_status\r
+(\r
+    uart_16550_instance_t * this_uart\r
+);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __CORE_16550_H */\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreGPIO/core_gpio.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreGPIO/core_gpio.c
new file mode 100644 (file)
index 0000000..e5dbd7e
--- /dev/null
@@ -0,0 +1,461 @@
+/*******************************************************************************\r
+ * (c) Copyright 2008-2015 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * CoreGPIO bare metal driver implementation.\r
+ *\r
+ * SVN $Revision: 7964 $\r
+ * SVN $Date: 2015-10-09 18:26:53 +0530 (Fri, 09 Oct 2015) $\r
+ */\r
+#include "core_gpio.h"\r
+#include "hal.h"\r
+#include "hal_assert.h"\r
+#include "coregpio_regs.h"\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ *\r
+ */\r
+#define GPIO_INT_ENABLE_MASK        (uint32_t)0x00000008UL\r
+#define OUTPUT_BUFFER_ENABLE_MASK   0x00000004UL\r
+\r
+\r
+#define NB_OF_GPIO  32\r
+\r
+#define CLEAR_ALL_IRQ32     (uint32_t)0xFFFFFFFF\r
+#define CLEAR_ALL_IRQ16     (uint16_t)0xFFFF\r
+#define CLEAR_ALL_IRQ8      (uint8_t)0xFF\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * GPIO_init()\r
+ * See "core_gpio.h" for details of how to use this function.\r
+ */\r
+void GPIO_init\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    addr_t              base_addr,\r
+    gpio_apb_width_t    bus_width\r
+)\r
+{\r
+    uint8_t i = 0;\r
+    addr_t cfg_reg_addr = base_addr;\r
+    \r
+    this_gpio->base_addr = base_addr;\r
+    this_gpio->apb_bus_width = bus_width;\r
+    \r
+    /* Clear configuration. */\r
+    for( i = 0, cfg_reg_addr = base_addr; i < NB_OF_GPIO; ++i )\r
+    {\r
+        HW_set_8bit_reg( cfg_reg_addr, 0 );\r
+        cfg_reg_addr += 4;\r
+    }\r
+    /* Clear any pending interrupts */\r
+    switch( this_gpio->apb_bus_width )\r
+    {\r
+        case GPIO_APB_32_BITS_BUS:\r
+            HAL_set_32bit_reg( this_gpio->base_addr, IRQ, CLEAR_ALL_IRQ32 );\r
+            break;\r
+            \r
+        case GPIO_APB_16_BITS_BUS:\r
+            HAL_set_16bit_reg( this_gpio->base_addr, IRQ0, (uint16_t)CLEAR_ALL_IRQ16 );\r
+            HAL_set_16bit_reg( this_gpio->base_addr, IRQ1, (uint16_t)CLEAR_ALL_IRQ16 );\r
+            break;\r
+            \r
+        case GPIO_APB_8_BITS_BUS:\r
+            HAL_set_8bit_reg( this_gpio->base_addr, IRQ0, (uint8_t)CLEAR_ALL_IRQ8 );\r
+            HAL_set_8bit_reg( this_gpio->base_addr, IRQ1, (uint8_t)CLEAR_ALL_IRQ8 );\r
+            HAL_set_8bit_reg( this_gpio->base_addr, IRQ2, (uint8_t)CLEAR_ALL_IRQ8 );\r
+            HAL_set_8bit_reg( this_gpio->base_addr, IRQ3, (uint8_t)CLEAR_ALL_IRQ8 );\r
+            break;\r
+            \r
+        default:\r
+            HAL_ASSERT(0);\r
+            break;\r
+    }\r
+}\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * GPIO_config\r
+ * See "core_gpio.h" for details of how to use this function.\r
+ */\r
+void GPIO_config\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    gpio_id_t           port_id,\r
+    uint32_t            config\r
+)\r
+{\r
+    HAL_ASSERT( port_id < NB_OF_GPIO );\r
+    \r
+    if ( port_id < NB_OF_GPIO )\r
+    {\r
+        uint32_t cfg_reg_addr = this_gpio->base_addr;\r
+        cfg_reg_addr += (port_id * 4);\r
+        HW_set_32bit_reg( cfg_reg_addr, config );\r
+        \r
+        /*\r
+         * Verify that the configuration was correctly written. Failure to read\r
+         * back the expected value may indicate that the GPIO port was configured\r
+         * as part of the hardware flow and cannot be modified through software.\r
+         * It may also indicate that the base address passed as parameter to\r
+         * GPIO_init() was incorrect.\r
+         */\r
+        HAL_ASSERT( HW_get_32bit_reg( cfg_reg_addr ) == config );\r
+    }\r
+}\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * GPIO_set_outputs\r
+ * See "core_gpio.h" for details of how to use this function.\r
+ */\r
+void GPIO_set_outputs\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    uint32_t            value\r
+)\r
+{\r
+    switch( this_gpio->apb_bus_width )\r
+    {\r
+        case GPIO_APB_32_BITS_BUS:\r
+            HAL_set_32bit_reg( this_gpio->base_addr, GPIO_OUT, value );\r
+            break;\r
+            \r
+        case GPIO_APB_16_BITS_BUS:\r
+            HAL_set_16bit_reg( this_gpio->base_addr, GPIO_OUT0, (uint16_t)value );\r
+            HAL_set_16bit_reg( this_gpio->base_addr, GPIO_OUT1, (uint16_t)(value >> 16) );\r
+            break;\r
+            \r
+        case GPIO_APB_8_BITS_BUS:\r
+            HAL_set_8bit_reg( this_gpio->base_addr, GPIO_OUT0, (uint8_t)value );\r
+            HAL_set_8bit_reg( this_gpio->base_addr, GPIO_OUT1, (uint8_t)(value >> 8) );\r
+            HAL_set_8bit_reg( this_gpio->base_addr, GPIO_OUT2, (uint8_t)(value >> 16) );\r
+            HAL_set_8bit_reg( this_gpio->base_addr, GPIO_OUT3, (uint8_t)(value >> 24) );\r
+            break;\r
+            \r
+        default:\r
+            HAL_ASSERT(0);\r
+            break;\r
+    }\r
+    \r
+    /*\r
+     * Verify that the output register was correctly written. Failure to read back\r
+     * the expected value may indicate that some of the GPIOs may not exist due to\r
+     * the number of GPIOs selected in the CoreGPIO hardware flow configuration.\r
+     * It may also indicate that the base address or APB bus width passed as\r
+     * parameter to the GPIO_init() function do not match the hardware design.\r
+     */\r
+    HAL_ASSERT( GPIO_get_outputs( this_gpio ) == value );\r
+}\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * GPIO_get_inputs\r
+ * See "core_gpio.h" for details of how to use this function.\r
+ */\r
+uint32_t GPIO_get_inputs\r
+(\r
+    gpio_instance_t *   this_gpio\r
+)\r
+{\r
+    uint32_t gpio_in = 0;\r
+    \r
+    switch( this_gpio->apb_bus_width )\r
+    {\r
+        case GPIO_APB_32_BITS_BUS:\r
+            gpio_in = HAL_get_32bit_reg( this_gpio->base_addr, GPIO_IN );\r
+            break;\r
+            \r
+        case GPIO_APB_16_BITS_BUS:\r
+            gpio_in |= HAL_get_16bit_reg( this_gpio->base_addr, GPIO_IN0 );\r
+            gpio_in |= (HAL_get_16bit_reg( this_gpio->base_addr, GPIO_IN1 ) << 16);\r
+            break;\r
+            \r
+        case GPIO_APB_8_BITS_BUS:\r
+            gpio_in |= HAL_get_8bit_reg( this_gpio->base_addr, GPIO_IN0 );\r
+            gpio_in |= (HAL_get_8bit_reg( this_gpio->base_addr, GPIO_IN1 ) << 8);\r
+            gpio_in |= (HAL_get_8bit_reg( this_gpio->base_addr, GPIO_IN2 ) << 16);\r
+            gpio_in |= (HAL_get_8bit_reg( this_gpio->base_addr, GPIO_IN3 ) << 24);\r
+            break;\r
+            \r
+        default:\r
+            HAL_ASSERT(0);\r
+            break;\r
+    }\r
+    \r
+    return gpio_in;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * GPIO_get_outputs\r
+ * See "core_gpio.h" for details of how to use this function.\r
+ */\r
+uint32_t GPIO_get_outputs\r
+(\r
+    gpio_instance_t *   this_gpio\r
+)\r
+{\r
+    uint32_t gpio_out = 0;\r
+    \r
+    switch( this_gpio->apb_bus_width )\r
+    {\r
+        case GPIO_APB_32_BITS_BUS:\r
+            gpio_out = HAL_get_32bit_reg( this_gpio->base_addr, GPIO_OUT );\r
+            break;\r
+            \r
+        case GPIO_APB_16_BITS_BUS:\r
+            gpio_out |= HAL_get_16bit_reg( this_gpio->base_addr, GPIO_OUT0 );\r
+            gpio_out |= (HAL_get_16bit_reg( this_gpio->base_addr, GPIO_OUT1 ) << 16);\r
+            break;\r
+            \r
+        case GPIO_APB_8_BITS_BUS:\r
+            gpio_out |= HAL_get_16bit_reg( this_gpio->base_addr, GPIO_OUT0 );\r
+            gpio_out |= (HAL_get_16bit_reg( this_gpio->base_addr, GPIO_OUT1 ) << 8);\r
+            gpio_out |= (HAL_get_16bit_reg( this_gpio->base_addr, GPIO_OUT2 ) << 16);\r
+            gpio_out |= (HAL_get_16bit_reg( this_gpio->base_addr, GPIO_OUT3 ) << 24);\r
+            break;\r
+            \r
+        default:\r
+            HAL_ASSERT(0);\r
+            break;\r
+    }\r
+    \r
+    return gpio_out;\r
+}\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * GPIO_set_output\r
+ * See "core_gpio.h" for details of how to use this function.\r
+ */\r
+void GPIO_set_output\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    gpio_id_t           port_id,\r
+    uint8_t             value\r
+)\r
+{\r
+    HAL_ASSERT( port_id < NB_OF_GPIO );\r
+    \r
+            \r
+    switch( this_gpio->apb_bus_width )\r
+    {\r
+        case GPIO_APB_32_BITS_BUS:\r
+            {\r
+                uint32_t outputs_state;\r
+                \r
+                outputs_state = HAL_get_32bit_reg( this_gpio->base_addr, GPIO_OUT );\r
+                if ( 0 == value )\r
+                {\r
+                    outputs_state &= ~(1 << port_id);\r
+                }\r
+                else\r
+                {\r
+                    outputs_state |= 1 << port_id;\r
+                }\r
+                HAL_set_32bit_reg( this_gpio->base_addr, GPIO_OUT, outputs_state );\r
+                \r
+                /*\r
+                 * Verify that the output register was correctly written. Failure to read back\r
+                 * the expected value may indicate that some of the GPIOs may not exist due to\r
+                 * the number of GPIOs selected in the CoreGPIO hardware flow configuration.\r
+                 * It may also indicate that the base address or APB bus width passed as\r
+                 * parameter to the GPIO_init() function do not match the hardware design.\r
+                 */\r
+                HAL_ASSERT( HAL_get_32bit_reg( this_gpio->base_addr, GPIO_OUT ) == outputs_state );\r
+            }\r
+            break;\r
+            \r
+        case GPIO_APB_16_BITS_BUS:\r
+            {\r
+                uint16_t outputs_state;\r
+                uint32_t gpio_out_reg_addr = this_gpio->base_addr + GPIO_OUT_REG_OFFSET + ((port_id >> 4) * 4);\r
+                \r
+                outputs_state = HW_get_16bit_reg( gpio_out_reg_addr );\r
+                if ( 0 == value )\r
+                {\r
+                    outputs_state &= ~(1 << (port_id & 0x0F));\r
+                }\r
+                else\r
+                {\r
+                    outputs_state |= 1 << (port_id & 0x0F);\r
+                }\r
+                HW_set_16bit_reg( gpio_out_reg_addr, outputs_state );\r
+                \r
+                /*\r
+                 * Verify that the output register was correctly written. Failure to read back\r
+                 * the expected value may indicate that some of the GPIOs may not exist due to\r
+                 * the number of GPIOs selected in the CoreGPIO hardware flow configuration.\r
+                 * It may also indicate that the base address or APB bus width passed as\r
+                 * parameter to the GPIO_init() function do not match the hardware design.\r
+                 */\r
+                HAL_ASSERT( HW_get_16bit_reg( gpio_out_reg_addr ) == outputs_state );\r
+            }\r
+            break;\r
+            \r
+        case GPIO_APB_8_BITS_BUS:\r
+            {\r
+                uint8_t outputs_state;\r
+                uint32_t gpio_out_reg_addr = this_gpio->base_addr + GPIO_OUT_REG_OFFSET + ((port_id >> 3) * 4);\r
+                \r
+                outputs_state = HW_get_8bit_reg( gpio_out_reg_addr );\r
+                if ( 0 == value )\r
+                {\r
+                    outputs_state &= ~(1 << (port_id & 0x07));\r
+                }\r
+                else\r
+                {\r
+                    outputs_state |= 1 << (port_id & 0x07);\r
+                }\r
+                HW_set_8bit_reg( gpio_out_reg_addr, outputs_state );\r
+                \r
+                /*\r
+                 * Verify that the output register was correctly written. Failure to read back\r
+                 * the expected value may indicate that some of the GPIOs may not exist due to\r
+                 * the number of GPIOs selected in the CoreGPIO hardware flow configuration.\r
+                 * It may also indicate that the base address or APB bus width passed as\r
+                 * parameter to the GPIO_init() function do not match the hardware design.\r
+                 */\r
+                HAL_ASSERT( HW_get_8bit_reg( gpio_out_reg_addr ) == outputs_state );\r
+            }\r
+            break;\r
+            \r
+        default:\r
+            HAL_ASSERT(0);\r
+            break;\r
+    }\r
+}\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * GPIO_drive_inout\r
+ * See "core_gpio.h" for details of how to use this function.\r
+ */\r
+void GPIO_drive_inout\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    gpio_id_t           port_id,\r
+    gpio_inout_state_t  inout_state\r
+)\r
+{\r
+    uint32_t config;\r
+    uint32_t cfg_reg_addr = this_gpio->base_addr;\r
+    \r
+    HAL_ASSERT( port_id < NB_OF_GPIO );\r
+\r
+    switch( inout_state )\r
+    {\r
+        case GPIO_DRIVE_HIGH:\r
+            /* Set output high */\r
+            GPIO_set_output( this_gpio, port_id, 1 );\r
+            \r
+            /* Enable output buffer */\r
+            cfg_reg_addr = this_gpio->base_addr + (port_id * 4);\r
+            config = HW_get_8bit_reg( cfg_reg_addr );\r
+            config |= OUTPUT_BUFFER_ENABLE_MASK;\r
+            HW_set_8bit_reg( cfg_reg_addr, config );\r
+            break;\r
+            \r
+        case GPIO_DRIVE_LOW:\r
+            /* Set output low */\r
+            GPIO_set_output( this_gpio, port_id, 0 );\r
+            \r
+            /* Enable output buffer */\r
+            cfg_reg_addr = this_gpio->base_addr + (port_id * 4);\r
+            config = HW_get_8bit_reg( cfg_reg_addr );\r
+            config |= OUTPUT_BUFFER_ENABLE_MASK;\r
+            HW_set_8bit_reg( cfg_reg_addr, config );\r
+            break;\r
+            \r
+        case GPIO_HIGH_Z:\r
+            /* Disable output buffer */\r
+            cfg_reg_addr = this_gpio->base_addr + (port_id * 4);\r
+            config = HW_get_8bit_reg( cfg_reg_addr );\r
+            config &= ~OUTPUT_BUFFER_ENABLE_MASK;\r
+            HW_set_8bit_reg( cfg_reg_addr, config );\r
+            break;\r
+            \r
+        default:\r
+            HAL_ASSERT(0);\r
+            break;\r
+    }\r
+}\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * GPIO_enable_irq\r
+ * See "core_gpio.h" for details of how to use this function.\r
+ */\r
+void GPIO_enable_irq\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    gpio_id_t           port_id\r
+)\r
+{\r
+    uint32_t cfg_value;\r
+    uint32_t cfg_reg_addr = this_gpio->base_addr;\r
+   \r
+    HAL_ASSERT( port_id < NB_OF_GPIO );\r
+    \r
+    if ( port_id < NB_OF_GPIO )\r
+    {\r
+        cfg_reg_addr += (port_id * 4);\r
+        cfg_value = HW_get_8bit_reg( cfg_reg_addr );\r
+        cfg_value |= GPIO_INT_ENABLE_MASK;\r
+        HW_set_8bit_reg( cfg_reg_addr, cfg_value );\r
+    }\r
+}\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * GPIO_disable_irq\r
+ * See "core_gpio.h" for details of how to use this function.\r
+ */\r
+void GPIO_disable_irq\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    gpio_id_t           port_id\r
+)\r
+{\r
+    uint32_t cfg_value;\r
+    uint32_t cfg_reg_addr = this_gpio->base_addr;\r
+   \r
+    HAL_ASSERT( port_id < NB_OF_GPIO );\r
+    \r
+    if ( port_id < NB_OF_GPIO )\r
+    {\r
+        cfg_reg_addr += (port_id * 4);\r
+        cfg_value = HW_get_8bit_reg( cfg_reg_addr );\r
+        cfg_value &= ~GPIO_INT_ENABLE_MASK;\r
+        HW_set_8bit_reg( cfg_reg_addr, cfg_value );\r
+    }\r
+}\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * GPIO_clear_irq\r
+ * See "core_gpio.h" for details of how to use this function.\r
+ */\r
+void GPIO_clear_irq\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    gpio_id_t           port_id\r
+)\r
+{\r
+    uint32_t irq_clr_value = ((uint32_t)1) << ((uint32_t)port_id);\r
+    \r
+    switch( this_gpio->apb_bus_width )\r
+    {\r
+        case GPIO_APB_32_BITS_BUS:\r
+            HAL_set_32bit_reg( this_gpio->base_addr, IRQ, irq_clr_value );\r
+            break;\r
+            \r
+        case GPIO_APB_16_BITS_BUS:\r
+            HAL_set_16bit_reg( this_gpio->base_addr, IRQ0, irq_clr_value );\r
+            HAL_set_16bit_reg( this_gpio->base_addr, IRQ1, irq_clr_value >> 16 );\r
+            break;\r
+            \r
+        case GPIO_APB_8_BITS_BUS:\r
+            HAL_set_8bit_reg( this_gpio->base_addr, IRQ0, irq_clr_value );\r
+            HAL_set_8bit_reg( this_gpio->base_addr, IRQ1, irq_clr_value >> 8 );\r
+            HAL_set_8bit_reg( this_gpio->base_addr, IRQ2, irq_clr_value >> 16 );\r
+            HAL_set_8bit_reg( this_gpio->base_addr, IRQ3, irq_clr_value >> 24 );\r
+            break;\r
+            \r
+        default:\r
+            HAL_ASSERT(0);\r
+            break;\r
+    }\r
+}\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreGPIO/core_gpio.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreGPIO/core_gpio.h
new file mode 100644 (file)
index 0000000..68799be
--- /dev/null
@@ -0,0 +1,552 @@
+/*******************************************************************************\r
+ * (c) Copyright 2008-2015 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ *  CoreGPIO bare metal driver public API.\r
+ *\r
+ * SVN $Revision: 7964 $\r
+ * SVN $Date: 2015-10-09 18:26:53 +0530 (Fri, 09 Oct 2015) $\r
+ */\r
+\r
+/*=========================================================================*//**\r
+  @mainpage CoreGPIO Bare Metal Driver.\r
+\r
+  @section intro_sec Introduction\r
+  The CoreGPIO hardware IP includes up to 32 general purpose input output GPIOs.\r
+  This driver provides a set of functions for controlling the GPIOs as part of a\r
+  bare metal system where no operating system is available. These drivers\r
+  can be adapted for use as part of an operating system but the implementation\r
+  of the adaptation layer between this driver and the operating system's driver\r
+  model is outside the scope of this driver.\r
+  \r
+  @section driver_configuration Driver Configuration\r
+  The CoreGPIO individual IOs can be configured either in the hardware flow or\r
+  as part of the software application through calls to the GPIO_config() function.\r
+  GPIOs configured as as part of the hardware is fixed and cannot be modified\r
+  using a call to the GPI_config() function.\r
+  \r
+  @section theory_op Theory of Operation\r
+  The CoreGPIO driver uses the Actel Hardware Abstraction Layer (HAL) to access\r
+  hardware registers. You must ensure that the Actel HAL is included as part of\r
+  your software project. The Actel HAL is available through the Actel Firmware\r
+  Catalog.\r
+  \r
+  The CoreGPIO driver functions are logically grouped into the following groups:\r
+    - Initiliazation\r
+    - Configuration\r
+    - Reading and writing GPIO state\r
+    - Interrupt control\r
+  \r
+  The CoreGPIO driver is initialized through a call to the GPIO_init() function.\r
+  The GPIO_init() function must be called before any other GPIO driver functions\r
+  can be called.\r
+  \r
+  Each GPIO port is individually configured through a call to the\r
+  GPIO_config() function. Configuration includes deciding if a GPIO port\r
+  will be used as input, output or both. GPIO ports configured as inputs can be\r
+  further configured to generate interrupts based on the input's state.\r
+  Interrupts can be level or edge sensitive.\r
+  Please note that a CoreGPIO hardware instance can be generated, as part of the\r
+  hardware flow, with a fixed configuration for some or all of its IOs. Attempting\r
+  to modify the configuration of such a hardware configured IO using the\r
+  GPIO_config() function has no effect.\r
+  \r
+  The state of the GPIO ports can be read and written using the following\r
+  functions:\r
+    - GPIO_get_inputs()\r
+    - GPIO_get_outputs()\r
+    - GPIO_set_outputs()\r
+    - GPIO_drive_inout()\r
+    \r
+  Interrupts generated by GPIO ports configured as inputs are controlled using\r
+  the following functions:\r
+    - GPIO_enable_irq()\r
+    - GPIO_disable_irq()\r
+    - GPIO_clear_irq()\r
+  \r
+ *//*=========================================================================*/\r
+#ifndef CORE_GPIO_H_\r
+#define CORE_GPIO_H_\r
+\r
+#include <stdint.h>\r
+#include "cpu_types.h"\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The gpio_id_t enumeration is used to identify GPIOs as part of the\r
+  parameter to functions:\r
+    - GPIO_config(),\r
+    - GPIO_drive_inout(),\r
+    - GPIO_enable_int(),\r
+    - GPIO_disable_int(),\r
+    - GPIO_clear_int()\r
+ */\r
+typedef enum __gpio_id_t\r
+{\r
+    GPIO_0 = 0,\r
+    GPIO_1 = 1,\r
+    GPIO_2 = 2,\r
+    GPIO_3 = 3,\r
+    GPIO_4 = 4,\r
+    GPIO_5 = 5,\r
+    GPIO_6 = 6,\r
+    GPIO_7 = 7,\r
+    GPIO_8 = 8,\r
+    GPIO_9 = 9,\r
+    GPIO_10 = 10,\r
+    GPIO_11 = 11,\r
+    GPIO_12 = 12,\r
+    GPIO_13 = 13,\r
+    GPIO_14 = 14,\r
+    GPIO_15 = 15,\r
+    GPIO_16 = 16,\r
+    GPIO_17 = 17,\r
+    GPIO_18 = 18,\r
+    GPIO_19 = 19,\r
+    GPIO_20 = 20,\r
+    GPIO_21 = 21,\r
+    GPIO_22 = 22,\r
+    GPIO_23 = 23,\r
+    GPIO_24 = 24,\r
+    GPIO_25 = 25,\r
+    GPIO_26 = 26,\r
+    GPIO_27 = 27,\r
+    GPIO_28 = 28,\r
+    GPIO_29 = 29,\r
+    GPIO_30 = 30,\r
+    GPIO_31 = 31\r
+} gpio_id_t;\r
+\r
+typedef enum __gpio_apb_width_t\r
+{\r
+    GPIO_APB_8_BITS_BUS = 0,\r
+    GPIO_APB_16_BITS_BUS = 1,\r
+    GPIO_APB_32_BITS_BUS = 2,\r
+    GPIO_APB_UNKNOWN_BUS_WIDTH = 3\r
+} gpio_apb_width_t;\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ */\r
+typedef struct __gpio_instance_t\r
+{\r
+    addr_t              base_addr;\r
+    gpio_apb_width_t    apb_bus_width;\r
+} gpio_instance_t;\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  GPIO ports definitions used to identify GPIOs as part of the parameter to\r
+  function GPIO_set_outputs().\r
+  These definitions can also be used to identity GPIO through logical\r
+  operations on the return value of function GPIO_get_inputs().\r
+ */\r
+#define GPIO_0_MASK                0x00000001UL\r
+#define GPIO_1_MASK                0x00000002UL\r
+#define GPIO_2_MASK         0x00000004UL\r
+#define GPIO_3_MASK            0x00000008UL\r
+#define GPIO_4_MASK            0x00000010UL\r
+#define GPIO_5_MASK            0x00000020UL\r
+#define GPIO_6_MASK            0x00000040UL\r
+#define GPIO_7_MASK            0x00000080UL\r
+#define GPIO_8_MASK            0x00000100UL\r
+#define GPIO_9_MASK                0x00000200UL\r
+#define GPIO_10_MASK           0x00000400UL\r
+#define GPIO_11_MASK           0x00000800UL\r
+#define GPIO_12_MASK           0x00001000UL\r
+#define GPIO_13_MASK           0x00002000UL\r
+#define GPIO_14_MASK           0x00004000UL\r
+#define GPIO_15_MASK           0x00008000UL\r
+#define GPIO_16_MASK           0x00010000UL\r
+#define GPIO_17_MASK           0x00020000UL\r
+#define GPIO_18_MASK           0x00040000UL\r
+#define GPIO_19_MASK           0x00080000UL\r
+#define GPIO_20_MASK           0x00100000UL\r
+#define GPIO_21_MASK           0x00200000UL\r
+#define GPIO_22_MASK           0x00400000UL\r
+#define GPIO_23_MASK           0x00800000UL\r
+#define GPIO_24_MASK           0x01000000UL\r
+#define GPIO_25_MASK           0x02000000UL\r
+#define GPIO_26_MASK           0x04000000UL\r
+#define GPIO_27_MASK           0x08000000UL\r
+#define GPIO_28_MASK           0x10000000UL\r
+#define GPIO_29_MASK           0x20000000UL\r
+#define GPIO_30_MASK           0x40000000UL\r
+#define GPIO_31_MASK           0x80000000UL\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * GPIO modes\r
+ */\r
+#define GPIO_INPUT_MODE              0x0000000002UL\r
+#define GPIO_OUTPUT_MODE             0x0000000005UL\r
+#define GPIO_INOUT_MODE              0x0000000003UL\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * Possible GPIO inputs interrupt configurations.\r
+ */\r
+#define GPIO_IRQ_LEVEL_HIGH                    0x0000000000UL\r
+#define GPIO_IRQ_LEVEL_LOW                     0x0000000020UL\r
+#define GPIO_IRQ_EDGE_POSITIVE         0x0000000040UL\r
+#define GPIO_IRQ_EDGE_NEGATIVE         0x0000000060UL\r
+#define GPIO_IRQ_EDGE_BOTH                     0x0000000080UL\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+ * Possible states for GPIO configured as INOUT.\r
+ */\r
+typedef enum gpio_inout_state\r
+{\r
+    GPIO_DRIVE_LOW = 0,\r
+    GPIO_DRIVE_HIGH,\r
+    GPIO_HIGH_Z\r
+} gpio_inout_state_t;\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The GPIO_init() function initialises a CoreGPIO hardware instance and the data\r
+  structure associated with the CoreGPIO hardware instance.\r
+  Please note that a CoreGPIO hardware instance can be generated with a fixed\r
+  configuration for some or all of its IOs as part of the hardware flow. Attempting\r
+  to modify the configuration of such a hardware configured IO using the\r
+  GPIO_config() function has no effect.\r
+\r
+  @param this_gpio\r
+    Pointer to the gpio_instance_t data structure instance holding all data\r
+    regarding the CoreGPIO hardware instance being initialized. A pointer to the\r
+    same data structure will be used in subsequent calls to the CoreGPIO driver\r
+    functions in order to identify the CoreGPIO instance that should perform the\r
+    operation implemented by the called driver function.\r
+\r
+  @param base_addr\r
+    The base_addr parameter is the base address in the processor's memory map for\r
+    the registers of the GPIO instance being initialized.\r
+    \r
+  @param bus_width\r
+    The bus_width parameter informs the driver of the APB bus width selected during\r
+    the hardware flow configuration of the CoreGPIO hardware instance. It indicates\r
+    to the driver whether the CoreGPIO hardware registers will be visible as 8, 16\r
+    or 32 bits registers. Allowed value are:\r
+        - GPIO_APB_8_BITS_BUS\r
+        - GPIO_APB_16_BITS_BUS\r
+        - GPIO_APB_32_BITS_BUS\r
+  \r
+  @return\r
+    none.\r
+    \r
+  Example:\r
+  @code\r
+    #define COREGPIO_BASE_ADDR  0xC2000000\r
+    \r
+    gpio_instance_t g_gpio;\r
+    \r
+    void system_init( void )\r
+    {\r
+        GPIO_init( &g_gpio,    COREGPIO_BASE_ADDR, GPIO_APB_32_BITS_BUS );\r
+    }\r
+  @endcode\r
+  */\r
+void GPIO_init\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    addr_t              base_addr,\r
+    gpio_apb_width_t    bus_width\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The GPIO_config() function is used to configure an individual GPIO port.\r
\r
+  @param this_gpio\r
+    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
+    all data regarding the CoreGPIO instance controlled through this function call.\r
+\r
+  @param port_id\r
+    The port_id parameter identifies the GPIO port to be configured.\r
+    An enumeration item of the form GPIO_n where n is the number of the GPIO\r
+    port is used to identify the GPIO port. For example GPIO_0 identifies the\r
+    first GPIO port and GPIO_31 the last one.\r
+    \r
+  @param config\r
+    The config parameter specifies the configuration to be applied to the GPIO\r
+    port identified by the first parameter. It is a logical OR of GPIO mode and\r
+    the interrupt mode. The interrupt mode is only relevant if the GPIO is\r
+    configured as input.\r
+       Possible modes are:\r
+           - GPIO_INPUT_MODE,\r
+           - GPIO_OUTPUT_MODE,\r
+           - GPIO_INOUT_MODE.\r
+       Possible interrupt modes are:\r
+           - GPIO_IRQ_LEVEL_HIGH,\r
+           - GPIO_IRQ_LEVEL_LOW,\r
+           - GPIO_IRQ_EDGE_POSITIVE,\r
+           - GPIO_IRQ_EDGE_NEGATIVE,\r
+           - GPIO_IRQ_EDGE_BOTH\r
\r
+  @return\r
+    none.\r
+    \r
+  For example the following call will configure GPIO 4 as an input generating\r
+  interrupts on a low to high transition of the input:\r
+  @code\r
+  GPIO_config( &g_gpio, GPIO_4, GPIO_INPUT_MODE | GPIO_IRQ_EDGE_POSITIVE );\r
+  @endcode\r
+ */\r
+void GPIO_config\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    gpio_id_t           port_id,\r
+    uint32_t            config\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The GPIO_set_outputs() function is used to set the state of the GPIO ports\r
+  configured as outputs.\r
\r
+  @param this_gpio\r
+    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
+    all data regarding the CoreGPIO instance controlled through this function call.\r
+\r
+  @param value\r
+    The value parameter specifies the state of the GPIO ports configured as\r
+    outputs. It is a bit mask of the form (GPIO_n_MASK | GPIO_m_MASK) where n\r
+    and m are numbers identifying GPIOs.\r
+    For example (GPIO_0_MASK | GPIO_1_MASK | GPIO_2_MASK ) specifies that the\r
+    first, second and third GPIOs' must be set high and all other outputs set\r
+    low.\r
+\r
+  @return\r
+    none.\r
+    \r
+  Example 1:\r
+    Set GPIOs outputs 0 and 8 high and all other GPIO outputs low.\r
+    @code\r
+        GPIO_set_outputs( &g_gpio, GPIO_0_MASK | GPIO_8_MASK );\r
+    @endcode\r
+\r
+  Example 2:\r
+    Set GPIOs outputs 2 and 4 low without affecting other GPIO outputs.\r
+    @code\r
+        uint32_t gpio_outputs;\r
+        gpio_outputs = GPIO_get_outputs( &g_gpio );\r
+        gpio_outputs &= ~( GPIO_2_MASK | GPIO_4_MASK );\r
+        GPIO_set_outputs( &g_gpio, gpio_outputs );\r
+    @endcode\r
+\r
+  @see GPIO_get_outputs()\r
+ */\r
+void GPIO_set_outputs\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    uint32_t            value\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The GPIO_set_output() function is used to set the state of a single GPIO\r
+  port configured as output.\r
\r
+  @param this_gpio\r
+    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
+    all data regarding the CoreGPIO instance controlled through this function call.\r
+\r
+  @param port_id\r
+    The port_id parameter specifies the GPIO port that will have its output set\r
+    by a call to this function.\r
+  \r
+  @param value\r
+    The value parameter specifies the desired state for the GPIO output. A value\r
+    of 0 will set the output low and a value of 1 will set the port high.\r
+  \r
+  @return\r
+    none.\r
+ */\r
+void GPIO_set_output\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    gpio_id_t           port_id,\r
+    uint8_t             value\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The GPIO_get_inputs() function is used to read the state of all GPIOs\r
+  confgured as inputs.\r
\r
+  @param this_gpio\r
+    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
+    all data regarding the CoreGPIO instance controlled through this function call.\r
+\r
+  @return\r
+    This function returns a 32 bit unsigned integer where each bit represents\r
+    the state of an input. The least significant bit representing the state of\r
+    GPIO 0 and the most significant bit the state of GPIO 31.\r
+ */\r
+uint32_t GPIO_get_inputs\r
+(\r
+    gpio_instance_t *   this_gpio\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The GPIO_get_outputs() function is used to read the current state of all\r
+  GPIO outputs.\r
\r
+  @param this_gpio\r
+    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
+    all data regarding the CoreGPIO instance controlled through this function call.\r
+\r
+  @return\r
+     This function returns a 32 bit unsigned integer where each bit represents\r
+     the state of an output. The least significant bit representing the state\r
+     of GPIO 0 and the most significant bit the state of GPIO 31.\r
+ */\r
+uint32_t GPIO_get_outputs\r
+(\r
+    gpio_instance_t *   this_gpio\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The GPIO_drive_inout() function is used to set the output state of a\r
+  GPIO configured as INOUT. An INOUT GPIO can be in one of three states:\r
+    - high\r
+    - low\r
+    - high impedance\r
+  An INOUT output would typically be used where several devices can drive the\r
+  state of a signal. The high and low states are equivalent to the high and low\r
+  states of a GPIO configured as output. The high impedance state is used to\r
+  prevent the GPIO from driving the state of the output and therefore allow\r
+  reading the state of the GPIO as an input.\r
+  Please note that the GPIO port you wish to use as INOUT through this function\r
+  must be configurable through software. Therefore the GPIO ports used as INOUT\r
+  must not have a fixed configuration selected as part of the hardware flow.\r
\r
+  @param this_gpio\r
+    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
+    all data regarding the CoreGPIO instance controlled through this function call.\r
+\r
+  @param port_id\r
+    The port_id parameter identifies the GPIO for whcih this function will\r
+    change the output state.\r
+    An enumeration item of the form GPIO_n where n is the number of the GPIO\r
+    port is used to identify the GPIO port. For example GPIO_0 identifies the\r
+    first GPIO port and GPIO_31 the last one.\r
+    \r
+  @param inout_state\r
+    The inout_state parameter specifies the state of the I/O identified by the\r
+    first parameter. Possible states are:\r
+                           - GPIO_DRIVE_HIGH,\r
+                           - GPIO_DRIVE_LOW,\r
+                           - GPIO_HIGH_Z (high impedance)\r
+\r
+  @return\r
+    none.\r
+    \r
+  Example:\r
+    The call to GPIO_drive_inout() below will set the GPIO 7 output to\r
+    high impedance state.\r
+    @code\r
+    GPIO_drive_inout( &g_gpio, GPIO_7, GPIO_HIGH_Z );\r
+    @endcode\r
+ */\r
+void GPIO_drive_inout\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    gpio_id_t           port_id,\r
+    gpio_inout_state_t  inout_state\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The GPIO_enable_irq() function is used to enable an interrupt to be\r
+  generated based on the state of the input identified as parameter.\r
\r
+  @param this_gpio\r
+    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
+    all data regarding the CoreGPIO instance controlled through this function call.\r
+\r
+  @param port_id\r
+    The port_id parameter identifies the GPIO input the call to\r
+    GPIO_enable_irq() will enable to generate interrupts.\r
+    An enumeration item of the form GPIO_n where n is the number of the GPIO\r
+    port is used to identify the GPIO port. For example GPIO_0 identifies the\r
+    first GPIO port and GPIO_31 the last one.\r
+    \r
+  @return\r
+    none.\r
+    \r
+  Example:\r
+    The call to GPIO_enable_irq() below will allow GPIO 8 to generate\r
+    interrupts.\r
+    @code\r
+    GPIO_enable_irq( &g_gpio, GPIO_8 );\r
+    @endcode\r
+ */\r
+void GPIO_enable_irq\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    gpio_id_t           port_id\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The GPIO_disable_irq() function is used to disable interrupt from being\r
+  generated based on the state of the input specified as parameter.\r
\r
+  @param this_gpio\r
+    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
+    all data regarding the CoreGPIO instance controlled through this function call.\r
+\r
+  @param port_id\r
+    The port_id parameter identifies the GPIO input the call to\r
+    GPIO_disable_irq() will disable from generating interrupts.\r
+    An enumeration item of the form GPIO_n where n is the number of the GPIO\r
+    port is used to identify the GPIO port. For example GPIO_0 identifies the\r
+    first GPIO port and GPIO_31 the last one.\r
\r
+  @return\r
+    none.\r
+    \r
+  Example:\r
+    The call to GPIO_disable_irq() below will prevent GPIO 8 from generating\r
+    interrupts.\r
+    @code\r
+    GPIO_disable_irq( &g_gpio, GPIO_8 );\r
+    @endcode\r
+ */\r
+void GPIO_disable_irq\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    gpio_id_t           port_id\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The GPIO_clear_irq() function is used to clear the interrupt generated by\r
+  the GPIO specified as parameter. The GPIO_clear_irq() function  must be\r
+  called as part of a GPIO interrupt service routine (ISR) in order to prevent\r
+  the same interrupt event retriggering a call to the GPIO ISR.\r
+  Please note that interrupts may also need to be cleared in the processor's\r
+  interrupt controller.\r
\r
+  @param this_gpio\r
+    The this_gpio parameter is a pointer to the gpio_instance_t structure holding\r
+    all data regarding the CoreGPIO instance controlled through this function call.\r
+\r
+  @param port_id\r
+    The port_id parameter identifies the GPIO input for which to clear the\r
+    interrupt.\r
+    An enumeration item of the form GPIO_n where n is the number of the GPIO\r
+    port is used to identify the GPIO port. For example GPIO_0 identifies the\r
+    first GPIO port and GPIO_31 the last one.\r
+    \r
+  @return\r
+    none.\r
+    \r
+  Example:\r
+    The example below demonstrates the use of the GPIO_clear_irq() function as\r
+    part of the GPIO 9 interrupt service routine on a Cortex-M processor.  \r
+    @code\r
+    void GPIO9_IRQHandler( void )\r
+    {\r
+        do_interrupt_processing();\r
+        \r
+        GPIO_clear_irq( &g_gpio, GPIO_9 );\r
+        \r
+        NVIC_ClearPendingIRQ( GPIO9_IRQn );\r
+    }\r
+    @endcode\r
+ */\r
+void GPIO_clear_irq\r
+(\r
+    gpio_instance_t *   this_gpio,\r
+    gpio_id_t           port_id\r
+);\r
+\r
+#endif /* CORE_GPIO_H_ */\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreGPIO/coregpio_regs.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreGPIO/coregpio_regs.h
new file mode 100644 (file)
index 0000000..afbbfbc
--- /dev/null
@@ -0,0 +1,40 @@
+/*******************************************************************************\r
+ * (c) Copyright 2009-2015 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * SVN $Revision: 7964 $\r
+ * SVN $Date: 2015-10-09 18:26:53 +0530 (Fri, 09 Oct 2015) $\r
+ */\r
+#ifndef __CORE_GPIO_REGISTERS_H\r
+#define __CORE_GPIO_REGISTERS_H                1\r
+\r
+/*------------------------------------------------------------------------------\r
+ * \r
+ */\r
+#define IRQ_REG_OFFSET          0x80\r
+\r
+#define IRQ0_REG_OFFSET         0x80\r
+#define IRQ1_REG_OFFSET         0x84\r
+#define IRQ2_REG_OFFSET         0x88\r
+#define IRQ3_REG_OFFSET         0x8C\r
+\r
+/*------------------------------------------------------------------------------\r
+ * \r
+ */\r
+#define GPIO_IN_REG_OFFSET      0x90\r
+\r
+#define GPIO_IN0_REG_OFFSET     0x90\r
+#define GPIO_IN1_REG_OFFSET     0x94\r
+#define GPIO_IN2_REG_OFFSET     0x98\r
+#define GPIO_IN3_REG_OFFSET     0x9C\r
+\r
+/*------------------------------------------------------------------------------\r
+ * \r
+ */\r
+#define GPIO_OUT_REG_OFFSET     0xA0\r
+\r
+#define GPIO_OUT0_REG_OFFSET    0xA0\r
+#define GPIO_OUT1_REG_OFFSET    0xA4\r
+#define GPIO_OUT2_REG_OFFSET    0xA8\r
+#define GPIO_OUT3_REG_OFFSET    0xAC\r
+\r
+#endif /* __CORE_GPIO_REGISTERS_H */\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_i2c.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_i2c.c
new file mode 100644 (file)
index 0000000..daa1887
--- /dev/null
@@ -0,0 +1,1563 @@
+/*******************************************************************************\r
+ * (c) Copyright 2009-2015 Microsemi  SoC Products Group.  All rights reserved.\r
+ * \r
+ * CoreI2C software driver implementation.\r
+ * \r
+ * SVN $Revision: 7984 $\r
+ * SVN $Date: 2015-10-12 12:07:40 +0530 (Mon, 12 Oct 2015) $\r
+ */\r
+#include <stdint.h>\r
+#include <stdlib.h>\r
+#include <stddef.h>\r
+#include <unistd.h>\r
+#include <errno.h>\r
+#include <sys/stat.h>\r
+#include <sys/times.h>\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include "cpu_types.h"\r
+#include "core_smbus_regs.h"\r
+#include "core_i2c.h"\r
+#include "hal.h"\r
+#include "hal_assert.h"\r
+\r
+\r
+#include <string.h>\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C transaction direction.\r
+ */\r
+#define WRITE_DIR    0u\r
+#define READ_DIR     1u\r
+\r
+/* -- TRANSACTIONS TYPES -- */\r
+#define NO_TRANSACTION                      0u\r
+#define MASTER_WRITE_TRANSACTION            1u\r
+#define MASTER_READ_TRANSACTION             2u\r
+#define MASTER_RANDOM_READ_TRANSACTION      3u\r
+#define WRITE_SLAVE_TRANSACTION             4u\r
+#define READ_SLAVE_TRANSACTION              5u\r
+\r
+/* -- SMBUS H/W STATES -- */\r
+/* -- MASTER STATES -- */\r
+#define ST_BUS_ERROR        0x00u           /* Bus error during MST or selected slave modes */\r
+#define ST_I2C_IDLE         0xF8u           /* No activity and no interrupt either... */\r
+#define ST_START            0x08u           /* start condition sent */\r
+#define ST_RESTART          0x10u           /* repeated start */\r
+#define ST_SLAW_ACK         0x18u           /* SLA+W sent, ack received */\r
+#define ST_SLAW_NACK        0x20u           /* SLA+W sent, nack received */\r
+#define ST_TX_DATA_ACK      0x28u           /* Data sent, ACK'ed */\r
+#define ST_TX_DATA_NACK     0x30u           /* Data sent, NACK'ed */\r
+#define ST_LOST_ARB         0x38u           /* Master lost arbitration */\r
+#define ST_SLAR_ACK         0x40u           /* SLA+R sent, ACK'ed */\r
+#define ST_SLAR_NACK        0x48u           /* SLA+R sent, NACK'ed */\r
+#define ST_RX_DATA_ACK      0x50u           /* Data received, ACK sent */\r
+#define ST_RX_DATA_NACK     0x58u           /* Data received, NACK sent */\r
+#define ST_RESET_ACTIVATED  0xD0u           /* Master reset is activated */\r
+#define ST_STOP_TRANSMIT    0xE0u           /* Stop has been transmitted */\r
+\r
+/* -- SLAVE STATES -- */\r
+#define ST_SLAVE_SLAW       0x60u           /* SLA+W received */\r
+#define ST_SLAVE_SLAR_ACK   0xA8u           /* SLA+R received, ACK returned */\r
+#define ST_SLV_LA           0x68u           /* Slave lost arbitration */\r
+#define ST_GCA              0x70u           /* GCA received */\r
+#define ST_GCA_LA           0x78u           /* GCA lost arbitration */\r
+#define ST_RDATA            0x80u           /* Data received */\r
+#define ST_SLA_NACK         0x88u           /* Slave addressed, NACK returned */\r
+#define ST_GCA_ACK          0x90u           /* Previously addresses with GCA, data ACKed */\r
+#define ST_GCA_NACK         0x98u           /* GCA addressed, NACK returned */\r
+#define ST_RSTOP            0xA0u           /* Stop received */\r
+#define ST_SLARW_LA         0xB0u           /* Arbitration lost */\r
+#define ST_RACK             0xB8u           /* Byte sent, ACK received */\r
+#define ST_SLAVE_RNACK      0xC0u           /* Byte sent, NACK received */\r
+#define ST_FINAL            0xC8u           /* Final byte sent, ACK received */\r
+#define ST_SLV_RST          0xD8u           /* Slave reset state */\r
+\r
+\r
+/* I2C Channel base offset */\r
+#define CHANNEL_BASE_SHIFT    5u\r
+#define CHANNEL_MASK        0x1E0u\r
+\r
+/*\r
+ * Maximum address offset length in slave write-read transactions.\r
+ * A maximum of two bytes will be interpreted as address offset within the slave\r
+ * tx buffer.\r
+ */\r
+#define MAX_OFFSET_LENGTH       2u\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C interrupts control functions implemented "i2c_interrupt.c".\r
+ * the implementation of these functions depend on the underlying hardware\r
+ * design and how the CoreI2C interrupt line is connected to the system's\r
+ * interrupt controller.\r
+ */\r
+void I2C_enable_irq( i2c_instance_t * this_i2c );\r
+void I2C_disable_irq( i2c_instance_t * this_i2c );\r
+static void enable_slave_if_required(i2c_instance_t * this_i2c);\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_init()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_init\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    addr_t base_address,\r
+    uint8_t ser_address,\r
+    i2c_clock_divider_t ser_clock_speed\r
+)\r
+{\r
+    psr_t saved_psr;\r
+    uint_fast16_t clock_speed = (uint_fast16_t)ser_clock_speed;\r
+    \r
+    /*\r
+     * We need to disable ints while doing this as there is no guarantee we\r
+     * have not been called already and the ISR is active.\r
+     */\r
+\r
+   saved_psr=HAL_disable_interrupts();\r
+    \r
+    /*\r
+     * Initialize all items of the this_i2c data structure to zero. This\r
+     * initializes all state variables to their init value. It relies on\r
+     * the fact that NO_TRANSACTION, I2C_SUCCESS and I2C_RELEASE_BUS all\r
+     * have an actual value of zero.\r
+     */\r
+    memset(this_i2c, 0, sizeof(i2c_instance_t));\r
+    \r
+    /*\r
+     * Set base address of I2C hardware used by this instance.\r
+     */\r
+    this_i2c->base_address = base_address;\r
+\r
+    /*\r
+     * Update Serial address of the device\r
+     */\r
+    this_i2c->ser_address = ((uint_fast8_t)ser_address << 1u);\r
+    \r
+    /*\r
+     * Configure hardware.\r
+     */\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, ENS1, 0x00); /* Reset I2C hardware. */\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, ENS1, 0x01); /* set enable bit */\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, CR2, ( (clock_speed >> 2) & 0x01) );\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, CR1, ( (clock_speed >> 1) & 0x01) );\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, CR0, ( clock_speed & 0x01) );\r
+\r
+    HAL_set_8bit_reg(this_i2c->base_address, ADDRESS, this_i2c->ser_address);\r
+    HAL_set_8bit_reg(this_i2c->base_address, ADDRESS1, this_i2c->ser_address);\r
+    \r
+    /*\r
+     * Finally safe to enable interrupts.\r
+     */\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+}\r
+/*------------------------------------------------------------------------------\r
+ * I2C_channel_init()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_channel_init\r
+(\r
+    i2c_instance_t * this_i2c_channel,\r
+    i2c_instance_t * this_i2c,\r
+    i2c_channel_number_t channel_number,\r
+    i2c_clock_divider_t ser_clock_speed\r
+)\r
+{\r
+    psr_t saved_psr;\r
+    uint_fast16_t clock_speed = (uint_fast16_t)ser_clock_speed;\r
+    \r
+    HAL_ASSERT(channel_number < I2C_MAX_CHANNELS);\r
+    HAL_ASSERT(I2C_CHANNEL_0 != channel_number);\r
+\r
+    /* \r
+     * Cannot allow channel 0 in this function as we will trash the hardware\r
+     * base address and slave address.\r
+     */\r
+    if ((channel_number < I2C_MAX_CHANNELS) &&\r
+        (I2C_CHANNEL_0 != channel_number))\r
+    {\r
+        /*\r
+         * We need to disable ints while doing this as the hardware should already\r
+         * be active at this stage.\r
+         */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+        /*\r
+         * Initialize channel data.\r
+         */\r
+        memset(this_i2c_channel, 0, sizeof(i2c_instance_t));\r
+        \r
+        this_i2c_channel->base_address =\r
+               ((this_i2c->base_address) & ~((addr_t)CHANNEL_MASK)) \r
+            | (((addr_t)channel_number) << CHANNEL_BASE_SHIFT);\r
+\r
+        this_i2c_channel->ser_address = this_i2c->ser_address;\r
+\r
+        HAL_set_8bit_reg_field(this_i2c_channel->base_address, ENS1, 0x00); /* Reset I2C channel hardware. */\r
+        HAL_set_8bit_reg_field(this_i2c_channel->base_address, ENS1, 0x01); /* set enable bit */\r
+        HAL_set_8bit_reg_field(this_i2c_channel->base_address, CR2, ( (clock_speed >> 2) & 0x01) );\r
+        HAL_set_8bit_reg_field(this_i2c_channel->base_address, CR1, ( (clock_speed >> 1) & 0x01) );\r
+        HAL_set_8bit_reg_field(this_i2c_channel->base_address, CR0, ( clock_speed & 0x01) );\r
+        /*\r
+         * Finally safe to enable interrupts.\r
+         */\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+    }\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_write()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_write\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t serial_addr,\r
+    const uint8_t * write_buffer,\r
+    uint16_t write_size,\r
+    uint8_t options\r
+)\r
+{\r
+    psr_t saved_psr;\r
+    volatile uint8_t stat_ctrl;\r
+\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+\r
+    /* Update the transaction only when there is no transaction going on I2C */\r
+    if( this_i2c->transaction == NO_TRANSACTION)\r
+    {\r
+      this_i2c->transaction = MASTER_WRITE_TRANSACTION;\r
+    }\r
+\r
+    /* Update the Pending transaction information so that transaction can restarted */\r
+    this_i2c->pending_transaction = MASTER_WRITE_TRANSACTION ;\r
+\r
+    /* Update target address */\r
+    this_i2c->target_addr = (uint_fast8_t)serial_addr << 1u;\r
+    this_i2c->dir = WRITE_DIR;\r
+    this_i2c->master_tx_buffer = write_buffer;\r
+    this_i2c->master_tx_size = write_size;\r
+    this_i2c->master_tx_idx = 0u;\r
+\r
+    /* Set I2C status in progress */\r
+    this_i2c->master_status = I2C_IN_PROGRESS;\r
+    this_i2c->options = options;\r
+\r
+    if(I2C_IN_PROGRESS == this_i2c->slave_status)\r
+    {\r
+        this_i2c->is_transaction_pending = 1u;\r
+    }\r
+    else\r
+    {\r
+        HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
+    }\r
+\r
+    /*\r
+     * Clear interrupts if required (depends on repeated starts).\r
+     * Since the Bus is on hold, only then prior status needs to\r
+     * be cleared.\r
+     */\r
+    if ( I2C_HOLD_BUS == this_i2c->bus_status )\r
+    {\r
+        HAL_set_8bit_reg_field(this_i2c->base_address, SI, 0x00u);\r
+    }\r
+\r
+    stat_ctrl = HAL_get_8bit_reg( this_i2c->base_address, STATUS);\r
+    stat_ctrl = stat_ctrl;  /* Avoids lint warning. */\r
+\r
+    /* Enable the interrupt. ( Re-enable) */\r
+    I2C_enable_irq( this_i2c );\r
+\r
+\r
+       HAL_restore_interrupts(saved_psr);\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_read()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_read\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t serial_addr,\r
+    uint8_t * read_buffer,\r
+    uint16_t read_size,\r
+    uint8_t options\r
+)\r
+{\r
+    psr_t saved_psr;\r
+    volatile uint8_t stat_ctrl;\r
+\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+    \r
+    /* Update the transaction only when there is no transaction going on I2C */\r
+    if( this_i2c->transaction == NO_TRANSACTION)\r
+    {\r
+      this_i2c->transaction = MASTER_READ_TRANSACTION;\r
+    }\r
+\r
+    /* Update the Pending transaction information so that transaction can restarted */\r
+    this_i2c->pending_transaction = MASTER_READ_TRANSACTION ;\r
+\r
+    /* Update target address */\r
+    this_i2c->target_addr = (uint_fast8_t)serial_addr << 1u;\r
+\r
+    this_i2c->dir = READ_DIR;\r
+\r
+    this_i2c->master_rx_buffer = read_buffer;\r
+    this_i2c->master_rx_size = read_size;\r
+    this_i2c->master_rx_idx = 0u;\r
+\r
+    /* Set I2C status in progress */\r
+    this_i2c->master_status = I2C_IN_PROGRESS;\r
+\r
+    this_i2c->options = options;\r
+    \r
+    if(I2C_IN_PROGRESS == this_i2c->slave_status)\r
+    {\r
+        this_i2c->is_transaction_pending = 1u;\r
+    }\r
+    else\r
+    {\r
+        HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
+    }\r
+\r
+    /*\r
+     * Clear interrupts if required (depends on repeated starts).\r
+     * Since the Bus is on hold, only then prior status needs to\r
+     * be cleared.\r
+     */\r
+    if ( I2C_HOLD_BUS == this_i2c->bus_status )\r
+    {\r
+        HAL_set_8bit_reg_field(this_i2c->base_address, SI, 0x00u);\r
+    }\r
+\r
+    stat_ctrl = HAL_get_8bit_reg( this_i2c->base_address, STATUS);\r
+    stat_ctrl = stat_ctrl;  /* Avoids lint warning. */\r
+\r
+    /* Enable the interrupt. ( Re-enable) */\r
+    I2C_enable_irq( this_i2c );\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_write_read()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_write_read\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t serial_addr,\r
+    const uint8_t * addr_offset,\r
+    uint16_t offset_size,\r
+    uint8_t * read_buffer,\r
+    uint16_t read_size,\r
+    uint8_t options\r
+)\r
+{\r
+    HAL_ASSERT(offset_size > 0u);\r
+    HAL_ASSERT(addr_offset != (uint8_t *)0);\r
+    HAL_ASSERT(read_size > 0u);\r
+    HAL_ASSERT(read_buffer != (uint8_t *)0);\r
+    \r
+    this_i2c->master_status = I2C_FAILED;\r
+    \r
+    if((read_size > 0u) && (offset_size > 0u))\r
+    {\r
+        psr_t saved_psr;\r
+        volatile uint8_t stat_ctrl;\r
+\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+\r
+        /* Update the transaction only when there is no transaction going on I2C */\r
+        if( this_i2c->transaction == NO_TRANSACTION)\r
+        {\r
+            this_i2c->transaction = MASTER_RANDOM_READ_TRANSACTION;\r
+        }\r
+\r
+        /* Update the Pending transaction information so that transaction can restarted */\r
+        this_i2c->pending_transaction = MASTER_RANDOM_READ_TRANSACTION ;\r
+\r
+        /* Update target address */\r
+        this_i2c->target_addr = (uint_fast8_t)serial_addr << 1u;\r
+\r
+        this_i2c->dir = WRITE_DIR;\r
+\r
+        this_i2c->master_tx_buffer = addr_offset;\r
+        this_i2c->master_tx_size = offset_size;\r
+        this_i2c->master_tx_idx = 0u;\r
+\r
+        this_i2c->master_rx_buffer = read_buffer;\r
+        this_i2c->master_rx_size = read_size;\r
+        this_i2c->master_rx_idx = 0u;\r
+        \r
+        /* Set I2C status in progress */\r
+        this_i2c->master_status = I2C_IN_PROGRESS;\r
+        this_i2c->options = options;\r
+        \r
+        if(I2C_IN_PROGRESS == this_i2c->slave_status)\r
+        {\r
+            this_i2c->is_transaction_pending = 1u;\r
+        }\r
+        else\r
+        {\r
+            HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
+        }\r
+\r
+        /*\r
+         * Clear interrupts if required (depends on repeated starts).\r
+         * Since the Bus is on hold, only then prior status needs to\r
+         * be cleared.\r
+         */\r
+        if ( I2C_HOLD_BUS == this_i2c->bus_status )\r
+        {\r
+            HAL_set_8bit_reg_field(this_i2c->base_address, SI, 0x00u);\r
+        }\r
+\r
+        stat_ctrl = HAL_get_8bit_reg( this_i2c->base_address, STATUS);\r
+        stat_ctrl = stat_ctrl;  /* Avoids lint warning. */\r
+            \r
+        /* Enable the interrupt. ( Re-enable) */\r
+        I2C_enable_irq( this_i2c );\r
+\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+    }\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_get_status()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+i2c_status_t I2C_get_status\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    i2c_status_t i2c_status ;\r
+\r
+    i2c_status = this_i2c->master_status ;\r
+\r
+    return i2c_status;\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_wait_complete()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+i2c_status_t I2C_wait_complete\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint32_t timeout_ms\r
+)\r
+{\r
+    i2c_status_t i2c_status;\r
+    psr_t saved_psr;\r
+    /*\r
+     * Because we have no idea of what CPU we are supposed to be running on\r
+     * we need to guard this write to the timeout value to avoid ISR/user code\r
+     * interaction issues. Checking the status below should be fine as only a\r
+     * single byte should change in that.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+    this_i2c->master_timeout_ms = timeout_ms;\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+\r
+    /* Run the loop until state returns I2C_FAILED  or I2C_SUCESS*/\r
+    do {\r
+        i2c_status = this_i2c->master_status;\r
+    } while(I2C_IN_PROGRESS == i2c_status);\r
+    return i2c_status;\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_system_tick()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_system_tick\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint32_t ms_since_last_tick\r
+)\r
+{\r
+    if(this_i2c->master_timeout_ms != I2C_NO_TIMEOUT)\r
+    {\r
+       if(this_i2c->master_timeout_ms > ms_since_last_tick)\r
+        {\r
+            this_i2c->master_timeout_ms -= ms_since_last_tick;\r
+        }\r
+        else\r
+        {\r
+            psr_t saved_psr;\r
+            /*\r
+             * We need to disable interrupts here to ensure we can update the\r
+             * shared data without the I2C ISR interrupting us.\r
+             */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+\r
+            /*\r
+             * Mark current transaction as having timed out.\r
+             */\r
+            this_i2c->master_status = I2C_TIMED_OUT;\r
+            this_i2c->transaction = NO_TRANSACTION;\r
+            this_i2c->is_transaction_pending = 0;\r
+\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+            \r
+            /*\r
+             * Make sure we do not incorrectly signal a timeout for subsequent\r
+             * transactions.\r
+             */\r
+            this_i2c->master_timeout_ms = I2C_NO_TIMEOUT;\r
+        }\r
+    }\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_set_slave_tx_buffer()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_set_slave_tx_buffer\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    const uint8_t * tx_buffer,\r
+    uint16_t tx_size\r
+)\r
+{\r
+    psr_t saved_psr;\r
+\r
+    /*\r
+     * We need to disable interrupts here to ensure we can update the\r
+     * shared data without the I2C ISR interrupting us.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+    \r
+    this_i2c->slave_tx_buffer = tx_buffer;\r
+    this_i2c->slave_tx_size = tx_size;\r
+    this_i2c->slave_tx_idx = 0u;\r
+    \r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_set_slave_rx_buffer()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_set_slave_rx_buffer\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t * rx_buffer,\r
+    uint16_t rx_size\r
+)\r
+{\r
+    psr_t saved_psr;\r
+\r
+    /*\r
+     * We need to disable interrupts here to ensure we can update the\r
+     * shared data without the I2C ISR interrupting us.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+\r
+    this_i2c->slave_rx_buffer = rx_buffer;\r
+    this_i2c->slave_rx_size = rx_size;\r
+    this_i2c->slave_rx_idx = 0u;\r
+\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_set_slave_mem_offset_length()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_set_slave_mem_offset_length\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t offset_length\r
+)\r
+{\r
+    HAL_ASSERT(offset_length <= MAX_OFFSET_LENGTH);\r
+    \r
+    /*\r
+     * Single byte update, should be interrupt safe\r
+     */\r
+    if(offset_length > MAX_OFFSET_LENGTH)\r
+    {\r
+        this_i2c->slave_mem_offset_length = MAX_OFFSET_LENGTH;\r
+    }\r
+    else\r
+    {\r
+        this_i2c->slave_mem_offset_length = offset_length;\r
+    }\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_register_write_handler()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_register_write_handler\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    i2c_slave_wr_handler_t handler\r
+)\r
+{\r
+    psr_t saved_psr;\r
+\r
+    /*\r
+     * We need to disable interrupts here to ensure we can update the\r
+     * shared data without the I2C ISR interrupting us.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+\r
+    this_i2c->slave_write_handler = handler;\r
+\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_enable_slave()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_enable_slave\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    psr_t saved_psr;\r
+\r
+    /*\r
+     * We need to disable interrupts here to ensure we can update the\r
+     * hardware register and slave mode flag without the I2C ISR interrupting\r
+     * us.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+\r
+    /* Set the Assert Acknowledge bit. */\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x01u);\r
+\r
+    /* Enable slave mode */\r
+    this_i2c->is_slave_enabled = 1u;\r
+\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+\r
+    /* Enable I2C IRQ*/\r
+    I2C_enable_irq( this_i2c );\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_disable_slave()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_disable_slave\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    psr_t saved_psr;\r
+\r
+    /*\r
+     * We need to disable interrupts here to ensure we can update the\r
+     * hardware register without the I2C ISR interrupting us.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+    \r
+    /* Reset the assert acknowledge bit. */\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x00u);\r
+\r
+    /* Disable slave mode with IRQ blocked to make whole change atomic */\r
+    this_i2c->is_slave_enabled = 0u;\r
+\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * \r
+ */\r
+static void enable_slave_if_required\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    /*\r
+     * This function is only called from within the ISR and so does not need\r
+     * guarding on the register access.\r
+     */\r
+    if( 0 != this_i2c->is_slave_enabled )\r
+    {\r
+        HAL_set_8bit_reg_field( this_i2c->base_address, AA, 0x01u );\r
+    }\r
+}\r
+/*------------------------------------------------------------------------------\r
+ * I2C_set_slave_second_addr()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_set_slave_second_addr\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t second_slave_addr\r
+)\r
+{\r
+    uint8_t second_slave_address;\r
+    \r
+    /*\r
+      This function does not support CoreI2C hardware configured with a fixed \r
+      second slave address.  The current implementation of the ADDR1[0] register\r
+      bit makes it difficult for the driver to support both programmable and\r
+      fixed second slave address, so we choose to support programmable only.\r
+      With the programmable configuration, ADDR1[0] and ADDR0[0] both control\r
+      enable/disable of GCA recognition, as an effective OR of the 2 bit fields.\r
+      Therefore we set ADDR1[0] to 0 here, so that only ADDR0[0] controls GCA.\r
+     */\r
+    second_slave_address = (uint8_t)((second_slave_addr << 1u) & (~SLAVE1_EN_MASK));\r
+\r
+    /*\r
+     * Single byte register write, should be interrupt safe\r
+     */\r
+    HAL_set_8bit_reg(this_i2c->base_address, ADDRESS1, second_slave_address);\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_disable_slave_second_addr()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_disable_slave_second_addr\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    /*\r
+      We are disabling the second slave address by setting the value of the 2nd\r
+      slave address to the primary slave address. The reason for using this method\r
+      of disabling 2nd slave address is that ADDRESS1[0] has different meaning \r
+      depending on hardware configuration. Its use would likely interfere with\r
+      the intended GCA setting.\r
+     */\r
+    /*\r
+     * Single byte register write, should be interrupt safe\r
+     */\r
+    HAL_set_8bit_reg(this_i2c->base_address, ADDRESS1, this_i2c->ser_address);\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * i2C_set_gca()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+\r
+void I2C_set_gca\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    /* \r
+     * This read modify write access should be interrupt safe as the address\r
+     * register is not written to in the ISR.\r
+     */\r
+    /* accept GC addressing. */\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, GC, 0x01u);\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_clear_gca()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_clear_gca\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    /* \r
+     * This read modify write access should be interrupt safe as the address\r
+     * register is not written to in the ISR.\r
+     */\r
+    /* Clear GC addressing. */\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, GC, 0x00u);\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_isr()\r
+ * See "core_i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_isr\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    volatile uint8_t status;\r
+    uint8_t data;\r
+    uint8_t hold_bus;\r
+    uint8_t clear_irq = 1u;\r
+\r
+    status = HAL_get_8bit_reg( this_i2c->base_address, STATUS);\r
+    \r
+    switch( status )\r
+    {\r
+        /************** MASTER TRANSMITTER / RECEIVER *******************/\r
+      \r
+        case ST_START: /* start has been xmt'd */\r
+        case ST_RESTART: /* repeated start has been xmt'd */\r
+           //write_hex(STDOUT_FILENO, status);\r
+            HAL_set_8bit_reg_field( this_i2c->base_address, STA, 0x00u);\r
+            HAL_set_8bit_reg( this_i2c->base_address, DATA, this_i2c->target_addr); /* write call address */\r
+            HAL_set_8bit_reg_field( this_i2c->base_address, DIR, this_i2c->dir); /* set direction bit */\r
+            if(this_i2c->dir == WRITE_DIR)\r
+            {\r
+                 this_i2c->master_tx_idx = 0u;\r
+            }\r
+            else\r
+            {\r
+                 this_i2c->master_rx_idx = 0u;\r
+            }\r
+\r
+            /*\r
+             * Clear the pending transaction. This condition will be true if the slave \r
+             * has acquired the bus to carry out pending master transaction which \r
+             * it had received during its slave transmission or reception mode. \r
+             */\r
+            if(this_i2c->is_transaction_pending)\r
+            {\r
+                this_i2c->is_transaction_pending = 0u;\r
+            }\r
+\r
+            /*\r
+             * Make sure to update proper transaction after master START\r
+             * or RESTART\r
+             */\r
+            if(this_i2c->transaction != this_i2c->pending_transaction)\r
+            {\r
+                this_i2c->transaction = this_i2c->pending_transaction;\r
+            }\r
+            break;\r
+            \r
+        case ST_LOST_ARB:\r
+              /* Set start bit.  Let's keep trying!  Don't give up! */\r
+              HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
+              break;\r
+\r
+        case ST_STOP_TRANSMIT:\r
+             /* Stop has been transmitted. Do nothing */\r
+              break;\r
+\r
+        /******************* MASTER TRANSMITTER *************************/\r
+        case ST_SLAW_NACK:\r
+           //write_hex(STDOUT_FILENO, status);\r
+            /* SLA+W has been transmitted; not ACK has been received - let's stop. */\r
+            HAL_set_8bit_reg_field(this_i2c->base_address, STO, 0x01u);\r
+            this_i2c->master_status = I2C_FAILED;\r
+            this_i2c->transaction = NO_TRANSACTION;\r
+            enable_slave_if_required(this_i2c);\r
+            break;\r
+            \r
+        case ST_SLAW_ACK:\r
+        case ST_TX_DATA_ACK:\r
+           //write_hex(STDOUT_FILENO, status);\r
+            /* data byte has been xmt'd with ACK, time to send stop bit or repeated start. */\r
+            if (this_i2c->master_tx_idx < this_i2c->master_tx_size)\r
+            {    \r
+                HAL_set_8bit_reg(this_i2c->base_address, DATA, (uint_fast8_t)this_i2c->master_tx_buffer[this_i2c->master_tx_idx++]);\r
+            }\r
+            else if ( this_i2c->transaction == MASTER_RANDOM_READ_TRANSACTION )\r
+            {\r
+                /* We are finished sending the address offset part of a random read transaction.\r
+                 * It is is time to send a restart in order to change direction. */\r
+                 this_i2c->dir = READ_DIR;\r
+                 HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
+            }\r
+            else /* done sending. let's stop */\r
+            {\r
+                /*\r
+                 * Set the transaction back to NO_TRANSACTION to allow user to do further\r
+                 * transaction\r
+                 */\r
+                this_i2c->transaction = NO_TRANSACTION;\r
+                hold_bus = this_i2c->options & I2C_HOLD_BUS;\r
+\r
+                /* Store the information of current I2C bus status in the bus_status*/\r
+                this_i2c->bus_status  = hold_bus;\r
+                if ( hold_bus == 0u )\r
+                { \r
+                    HAL_set_8bit_reg_field(this_i2c->base_address, STO, 0x01u);  /*xmt stop condition */\r
+                    enable_slave_if_required(this_i2c);\r
+                }\r
+                else\r
+                {\r
+                    I2C_disable_irq( this_i2c );\r
+                    clear_irq = 0u;\r
+                }\r
+                this_i2c->master_status = I2C_SUCCESS;\r
+            }\r
+            break;\r
+\r
+          case ST_TX_DATA_NACK:\r
+           //write_hex(STDOUT_FILENO, status);\r
+            /* data byte SENT, ACK to be received\r
+             * In fact, this means we've received a NACK (This may not be \r
+             * obvious, but if we've rec'd an ACK then we would be in state \r
+             * 0x28!) hence, let's send a stop bit\r
+             */\r
+            HAL_set_8bit_reg_field(this_i2c->base_address, STO, 0x01u);/* xmt stop condition */\r
+            this_i2c->master_status = I2C_FAILED;\r
+\r
+            /*\r
+             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
+             * transaction\r
+             */\r
+            this_i2c->transaction = NO_TRANSACTION;\r
+            enable_slave_if_required(this_i2c);\r
+            break;\r
+              \r
+      /********************* MASTER (or slave?) RECEIVER *************************/\r
+      \r
+      /* STATUS codes 08H, 10H, 38H are all covered in MTX mode */\r
+        case ST_SLAR_ACK: /* SLA+R tx'ed. */\r
+//         //write_hex(STDOUT_FILENO, status);\r
+            /* Let's make sure we ACK the first data byte received (set AA bit in CTRL) unless\r
+             * the next byte is the last byte of the read transaction.\r
+             */\r
+            if(this_i2c->master_rx_size > 1u)\r
+            {\r
+                HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x01u);\r
+            }\r
+            else if(1u == this_i2c->master_rx_size)\r
+            {\r
+                HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x00u);\r
+            }\r
+            else /* this_i2c->master_rx_size == 0u */\r
+            {\r
+                HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x01u);\r
+                HAL_set_8bit_reg_field(this_i2c->base_address, STO, 0x01u);\r
+                this_i2c->master_status = I2C_SUCCESS;\r
+                this_i2c->transaction = NO_TRANSACTION;\r
+            }\r
+            break;\r
+            \r
+        case ST_SLAR_NACK: /* SLA+R tx'ed; let's release the bus (send a stop condition) */\r
+//         //write_hex(STDOUT_FILENO, status);\r
+            HAL_set_8bit_reg_field(this_i2c->base_address, STO, 0x01u);\r
+            this_i2c->master_status = I2C_FAILED;\r
+\r
+            /*\r
+             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
+             * transaction\r
+             */\r
+            this_i2c->transaction = NO_TRANSACTION;\r
+            enable_slave_if_required(this_i2c);\r
+            break;\r
+          \r
+        case ST_RX_DATA_ACK: /* Data byte received, ACK returned */\r
+//         //write_hex(STDOUT_FILENO, status);\r
+            /* First, get the data */\r
+            this_i2c->master_rx_buffer[this_i2c->master_rx_idx++] = HAL_get_8bit_reg(this_i2c->base_address, DATA);\r
+            if( this_i2c->master_rx_idx >= (this_i2c->master_rx_size - 1u))\r
+            {\r
+                /* If we're at the second last byte, let's set AA to 0 so\r
+                 * we return a NACK at the last byte. */\r
+                HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x00u);\r
+            }\r
+            break;\r
+            \r
+        case ST_RX_DATA_NACK: /* Data byte received, NACK returned */\r
+//         //write_hex(STDOUT_FILENO, status);\r
+            /* Get the data, then send a stop condition */\r
+            this_i2c->master_rx_buffer[this_i2c->master_rx_idx] = HAL_get_8bit_reg(this_i2c->base_address, DATA);\r
+          \r
+            hold_bus = this_i2c->options & I2C_HOLD_BUS; \r
+\r
+            /* Store the information of current I2C bus status in the bus_status*/\r
+            this_i2c->bus_status  = hold_bus;\r
+            if ( hold_bus == 0u )\r
+            { \r
+                HAL_set_8bit_reg_field(this_i2c->base_address, STO, 0x01u);  /*xmt stop condition */\r
+\r
+                /* Bus is released, now we can start listening to bus, if it is slave */\r
+                   enable_slave_if_required(this_i2c);\r
+            }\r
+            else\r
+            {\r
+                I2C_disable_irq( this_i2c );\r
+                clear_irq = 0u;\r
+            }\r
+            /*\r
+             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
+             * transaction\r
+             */\r
+            this_i2c->transaction = NO_TRANSACTION;\r
+            this_i2c->master_status = I2C_SUCCESS;\r
+            break;\r
+        \r
+        /******************** SLAVE RECEIVER **************************/\r
+        case ST_GCA_NACK: /* NACK after, GCA addressing */\r
+        case ST_SLA_NACK: /* Re-enable AA (assert ack) bit for future transmissions */\r
+           //write_hex(STDOUT_FILENO, status);\r
+            HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x01u);\r
+\r
+            this_i2c->transaction = NO_TRANSACTION;\r
+            this_i2c->slave_status = I2C_SUCCESS;\r
+            \r
+            /* Check if transaction was pending. If yes, set the START bit */\r
+            if(this_i2c->is_transaction_pending)\r
+            {\r
+                HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
+            }\r
+            break;\r
+            \r
+        case ST_GCA_LA: /* Arbitr. lost (GCA rec'd) */\r
+        case ST_SLV_LA: /* Arbitr. lost (SLA rec'd) */\r
+           //write_hex(STDOUT_FILENO, status);\r
+            /*\r
+             *  We lost arbitration and either the GCE or our address was the\r
+             *  one received so pend the master operation we were starting.\r
+             */\r
+            this_i2c->is_transaction_pending = 1u;\r
+            /* Fall through to normal ST processing as we are now in slave mode */\r
+\r
+        case ST_GCA: /* General call address received, ACK returned */\r
+        case ST_SLAVE_SLAW: /* SLA+W received, ACK returned */\r
+           //write_hex(STDOUT_FILENO, status);\r
+            this_i2c->transaction = WRITE_SLAVE_TRANSACTION;\r
+            this_i2c->slave_rx_idx = 0u;\r
+            this_i2c->random_read_addr = 0u;\r
+            /*\r
+             * If Start Bit is set clear it, but store that information since it is because of\r
+             * pending transaction\r
+             */\r
+            if(HAL_get_8bit_reg_field(this_i2c->base_address, STA))\r
+            {\r
+                HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x00u);\r
+                this_i2c->is_transaction_pending = 1u;\r
+            }\r
+            this_i2c->slave_status = I2C_IN_PROGRESS;\r
+#ifdef INCLUDE_SLA_IN_RX_PAYLOAD\r
+            /* Fall through to put address as first byte in payload buffer */\r
+#else\r
+            /* Only break from this case if the slave address must NOT be included at the\r
+             * beginning of the received write data. */\r
+            break;\r
+#endif            \r
+        case ST_GCA_ACK: /* DATA received; ACK sent after GCA */\r
+        case ST_RDATA: /* DATA received; must clear DATA register */\r
+           //write_hex(STDOUT_FILENO, status);\r
+            if((this_i2c->slave_rx_buffer != (uint8_t *)0)\r
+               && (this_i2c->slave_rx_idx < this_i2c->slave_rx_size))\r
+            {\r
+                data = HAL_get_8bit_reg(this_i2c->base_address, DATA);\r
+                this_i2c->slave_rx_buffer[this_i2c->slave_rx_idx++] = data;\r
+                \r
+#ifdef INCLUDE_SLA_IN_RX_PAYLOAD\r
+                if((ST_RDATA == status) || (ST_GCA_ACK == status))\r
+                {\r
+                    /* Ignore the slave address byte in the random read address\r
+                       computation in the case where INCLUDE_SLA_IN_RX_PAYLOAD\r
+                       is defined. */\r
+#endif\r
+                    this_i2c->random_read_addr = (this_i2c->random_read_addr << 8) + data;\r
+#ifdef INCLUDE_SLA_IN_RX_PAYLOAD\r
+                }\r
+#endif\r
+            }\r
+            \r
+            if(this_i2c->slave_rx_idx >= this_i2c->slave_rx_size)\r
+            {\r
+                /* Rx buffer is full. NACK next received byte. */\r
+                HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x00u); \r
+            }\r
+            break;\r
+            \r
+        case ST_RSTOP:\r
+           //write_hex(STDOUT_FILENO, status);\r
+            /* STOP or repeated START occurred. */\r
+            /* We cannot be sure if the transaction has actually completed as\r
+             * this hardware state reports that either a STOP or repeated START\r
+             * condition has occurred. We assume that this is a repeated START\r
+             * if the transaction was a write from the master to this point.*/\r
+            if ( this_i2c->transaction == WRITE_SLAVE_TRANSACTION )\r
+            {\r
+                if ( this_i2c->slave_rx_idx == this_i2c->slave_mem_offset_length )\r
+                {\r
+                    this_i2c->slave_tx_idx = this_i2c->random_read_addr;\r
+                }\r
+                /* Call the slave's write transaction handler if it exists. */\r
+                if ( this_i2c->slave_write_handler != 0u )\r
+                {\r
+                    i2c_slave_handler_ret_t h_ret;\r
+                    h_ret = this_i2c->slave_write_handler( this_i2c, this_i2c->slave_rx_buffer, (uint16_t)this_i2c->slave_rx_idx );\r
+                    if ( I2C_REENABLE_SLAVE_RX == h_ret )\r
+                    {\r
+                        /* There is a small risk that the write handler could\r
+                         * call I2C_disable_slave() but return\r
+                         * I2C_REENABLE_SLAVE_RX in error so we only enable\r
+                         * ACKs if still in slave mode. */\r
+                         enable_slave_if_required(this_i2c);\r
+                    }\r
+                    else\r
+                    {\r
+                        HAL_set_8bit_reg_field( this_i2c->base_address, AA, 0x0u );\r
+                        /* Clear slave mode flag as well otherwise in mixed\r
+                         * master/slave applications, the AA bit will get set by\r
+                         * subsequent master operations. */\r
+                        this_i2c->is_slave_enabled = 0u;\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    /* Re-enable address acknowledge in case we were ready to nack the next received byte. */\r
+                    HAL_set_8bit_reg_field( this_i2c->base_address, AA, 0x01u );\r
+                }\r
+            }\r
+            else /* A stop or repeated start outside a write/read operation */\r
+            {\r
+                /*\r
+                 * Reset slave_tx_idx so that a subsequent read will result in the slave's\r
+                 * transmit buffer being sent from the first byte.\r
+                 */\r
+                this_i2c->slave_tx_idx = 0u;\r
+                /*\r
+                 * See if we need to re-enable acknowledgement as some error conditions, such\r
+                 * as a master prematurely ending a transfer, can see us get here with AA set\r
+                 * to 0 which will disable slave operation if we are not careful.\r
+                 */\r
+                enable_slave_if_required(this_i2c);\r
+            }\r
+\r
+            /* Mark any previous master write transaction as complete. */\r
+            this_i2c->slave_status = I2C_SUCCESS;\r
+            \r
+            /* Check if transaction was pending. If yes, set the START bit */\r
+            if(this_i2c->is_transaction_pending)\r
+            {\r
+                HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
+            }\r
+\r
+            /*\r
+             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
+             * transaction\r
+             */\r
+            this_i2c->transaction = NO_TRANSACTION;\r
+\r
+            break;\r
+            \r
+        case ST_SLV_RST: /* SMBUS ONLY: timeout state. must clear interrupt */\r
+           //write_hex(STDOUT_FILENO, status);\r
+            /*\r
+             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
+             * transaction.\r
+             */\r
+            this_i2c->transaction = NO_TRANSACTION;\r
+            /*\r
+             * Reset slave_tx_idx so that a subsequent read will result in the slave's\r
+             * transmit buffer being sent from the first byte.\r
+             */\r
+            this_i2c->slave_tx_idx = 0u;\r
+            /*\r
+             * Clear status to I2C_FAILED only if there was an operation in progress.\r
+             */\r
+            if(I2C_IN_PROGRESS == this_i2c->slave_status)\r
+            {\r
+                this_i2c->slave_status = I2C_FAILED;\r
+            }\r
+\r
+            enable_slave_if_required(this_i2c); /* Make sure AA is set correctly */\r
+\r
+            break;\r
+            \r
+        /****************** SLAVE TRANSMITTER **************************/\r
+        case ST_SLAVE_SLAR_ACK: /* SLA+R received, ACK returned */\r
+        case ST_SLARW_LA:       /* Arbitration lost, and: */\r
+        case ST_RACK:           /* Data tx'ed, ACK received */\r
+           //write_hex(STDOUT_FILENO, status);\r
+            if ( status == ST_SLAVE_SLAR_ACK )\r
+            {\r
+                this_i2c->transaction = READ_SLAVE_TRANSACTION;\r
+                this_i2c->random_read_addr = 0u;\r
+                this_i2c->slave_status = I2C_IN_PROGRESS;\r
+                /* If Start Bit is set clear it, but store that information since it is because of\r
+                 * pending transaction\r
+                 */\r
+                if(HAL_get_8bit_reg_field(this_i2c->base_address, STA))\r
+                {\r
+                    HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x00u);\r
+                    this_i2c->is_transaction_pending = 1u;\r
+                 }\r
+            }\r
+            if (this_i2c->slave_tx_idx >= this_i2c->slave_tx_size)\r
+            {\r
+                /* Ensure 0xFF is returned to the master when the slave specifies\r
+                 * an empty transmit buffer. */\r
+                HAL_set_8bit_reg(this_i2c->base_address, DATA, 0xFFu);\r
+            }\r
+            else\r
+            {\r
+                /* Load the data the data byte to be sent to the master. */\r
+                HAL_set_8bit_reg(this_i2c->base_address, DATA, (uint_fast8_t)this_i2c->slave_tx_buffer[this_i2c->slave_tx_idx++]);\r
+            }\r
+            /* Determine if this is the last data byte to send to the master. */\r
+            if (this_i2c->slave_tx_idx >= this_i2c->slave_tx_size) /* last byte? */\r
+            {\r
+                 HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x00u); \r
+                /* Next read transaction will result in slave's transmit buffer\r
+                 * being sent from the first byte. */\r
+                this_i2c->slave_tx_idx = 0u;\r
+            }\r
+            break;\r
+        \r
+        case ST_SLAVE_RNACK:    /* Data byte has been transmitted; not-ACK has been received. */\r
+        case ST_FINAL: /* Last Data byte tx'ed, ACK received */\r
+           //write_hex(STDOUT_FILENO, status);\r
+            /* We assume that the transaction will be stopped by the master.\r
+             * Reset slave_tx_idx so that a subsequent read will result in the slave's\r
+             * transmit buffer being sent from the first byte. */\r
+            this_i2c->slave_tx_idx = 0u;\r
+            HAL_set_8bit_reg_field(this_i2c->base_address, AA, 0x01u); \r
+\r
+            /*  Mark previous state as complete */\r
+            this_i2c->slave_status = I2C_SUCCESS;\r
+            /* Check if transaction was pending. If yes, set the START bit */\r
+            if(this_i2c->is_transaction_pending)\r
+            {\r
+                HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x01u);\r
+            }\r
+            /*\r
+             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
+             * transaction\r
+             */\r
+            this_i2c->transaction = NO_TRANSACTION;\r
+\r
+            break;\r
+\r
+        /* Master Reset has been activated Wait 35 ms for interrupt to be set,\r
+         * clear interrupt and proceed to 0xF8 state. */\r
+        case ST_RESET_ACTIVATED:\r
+        case ST_BUS_ERROR: /* Bus error during MST or selected slave modes */\r
+        default:\r
+           //write_hex(STDOUT_FILENO, status);\r
+            /* Some undefined state has encountered. Clear Start bit to make\r
+             * sure, next good transaction happen */\r
+            HAL_set_8bit_reg_field(this_i2c->base_address, STA, 0x00u);\r
+            /*\r
+             * Set the transaction back to NO_TRANSACTION to allow user to do further\r
+             * transaction.\r
+             */\r
+            this_i2c->transaction = NO_TRANSACTION;\r
+            /*\r
+             * Reset slave_tx_idx so that a subsequent read will result in the slave's\r
+             * transmit buffer being sent from the first byte.\r
+             */\r
+            this_i2c->slave_tx_idx = 0u;\r
+            /*\r
+             * Clear statuses to I2C_FAILED only if there was an operation in progress.\r
+             */\r
+            if(I2C_IN_PROGRESS == this_i2c->master_status)\r
+            {\r
+                this_i2c->master_status = I2C_FAILED;\r
+            }\r
+\r
+            if(I2C_IN_PROGRESS == this_i2c->slave_status)\r
+            {\r
+                this_i2c->slave_status = I2C_FAILED;\r
+            }\r
+\r
+            break;\r
+    }\r
+    \r
+    if ( clear_irq )\r
+    {\r
+        /* clear interrupt. */\r
+        HAL_set_8bit_reg_field(this_i2c->base_address, SI, 0x00u);\r
+    }\r
+    \r
+    /* Read the status register to ensure the last I2C registers write took place\r
+     * in a system built around a bus making use of posted writes. */\r
+//    status = HAL_get_8bit_reg( this_i2c->base_address, STATUS);\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_smbus_init()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
\r
+/*\r
+ * SMBSUS_NO    = 1\r
+ * SMBALERT_NO  = 1\r
+ * SMBus enable = 1\r
+ */\r
+#define INIT_AND_ENABLE_SMBUS   0x54u\r
+void I2C_smbus_init\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    /*\r
+     * Single byte register write, should be interrupt safe\r
+     */\r
+    /* Enable SMBUS */\r
+    HAL_set_8bit_reg(this_i2c->base_address, SMBUS, INIT_AND_ENABLE_SMBUS);\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_enable_smbus_irq()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_enable_smbus_irq\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t  irq_type\r
+)\r
+{\r
+    psr_t saved_psr;\r
+\r
+    /*\r
+     * We need to disable interrupts here to ensure we can update the\r
+     * hardware register without the SMBUS IRQs interrupting us.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+\r
+    if ( irq_type & I2C_SMBALERT_IRQ)\r
+    {\r
+        HAL_set_8bit_reg_field(this_i2c->base_address, SMBALERT_IE, 0x01u);\r
+    }\r
+    if ( irq_type & I2C_SMBSUS_IRQ)\r
+    {\r
+        HAL_set_8bit_reg_field(this_i2c->base_address, SMBSUS_IE, 0x01u);\r
+    }\r
+    \r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_disable_smbus_irq()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_disable_smbus_irq\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t  irq_type\r
+)\r
+{\r
+    psr_t saved_psr;\r
+\r
+    /*\r
+     * We need to disable interrupts here to ensure we can update the\r
+     * hardware register without the SMBUS IRQs interrupting us.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+\r
+    if ( irq_type & I2C_SMBALERT_IRQ)\r
+    {\r
+        HAL_set_8bit_reg_field(this_i2c->base_address, SMBALERT_IE, 0x00u);\r
+    }\r
+    if (irq_type & I2C_SMBSUS_IRQ )\r
+    {\r
+        HAL_set_8bit_reg_field(this_i2c->base_address, SMBSUS_IE, 0x00u);\r
+    }\r
+    \r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_suspend_smbus_slave()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_suspend_smbus_slave\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    psr_t saved_psr;\r
+\r
+    /*\r
+     * We need to disable interrupts here to ensure we can update the\r
+     * hardware register without the SMBUS IRQs interrupting us.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, SMBSUS_NO_CONTROL, 0x00u);\r
+\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_resume_smbus_slave()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_resume_smbus_slave\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    psr_t saved_psr;\r
+\r
+    /*\r
+     * We need to disable interrupts here to ensure we can update the\r
+     * hardware register without the SMBUS IRQs interrupting us.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, SMBSUS_NO_CONTROL, 0x01u);\r
+\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_reset_smbus()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_reset_smbus\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    psr_t saved_psr;\r
+\r
+    /*\r
+     * We need to disable interrupts here to ensure we can update the\r
+     * hardware register without the SMBUS IRQs interrupting us.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, SMBUS_MST_RESET, 0x01u);\r
+    \r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_set_smbus_alert()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_set_smbus_alert\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    psr_t saved_psr;\r
+\r
+    /*\r
+     * We need to disable interrupts here to ensure we can update the\r
+     * hardware register without the SMBUS IRQs interrupting us.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, SMBALERT_NO_CONTROL, 0x00u);\r
+\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_clear_smbus_alert()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_clear_smbus_alert\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    psr_t saved_psr;\r
+\r
+    /*\r
+     * We need to disable interrupts here to ensure we can update the\r
+     * hardware register without the SMBUS IRQs interrupting us.\r
+     */\r
+\r
+       saved_psr=HAL_disable_interrupts();\r
+\r
+    HAL_set_8bit_reg_field(this_i2c->base_address, SMBALERT_NO_CONTROL, 0x01u);\r
+\r
+\r
+       HAL_restore_interrupts( saved_psr );\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_get_irq_status()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+uint8_t I2C_get_irq_status\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    uint8_t status ;\r
+    uint8_t irq_type = I2C_NO_IRQ ;\r
+\r
+    status = HAL_get_8bit_reg(this_i2c->base_address, SMBUS);\r
+\r
+    if( status & (uint8_t)SMBALERT_NI_STATUS_MASK )\r
+    {\r
+        irq_type |= I2C_SMBALERT_IRQ ;\r
+    }\r
+\r
+    if( status & (uint8_t)SMBSUS_NI_STATUS_MASK )\r
+    {\r
+        irq_type |= I2C_SMBSUS_IRQ ;\r
+    }\r
+\r
+    status = HAL_get_8bit_reg(this_i2c->base_address, CONTROL);\r
+\r
+    if( status & (uint8_t)SI_MASK )\r
+    {\r
+        irq_type |= I2C_INTR_IRQ ;\r
+    }\r
+    return(irq_type);\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_set_slave_addr2()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+void I2C_set_user_data\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    void * p_user_data\r
+)\r
+{\r
+    this_i2c->p_user_data = p_user_data ;\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * I2C_get_user_data()\r
+ * See "i2c.h" for details of how to use this function.\r
+ */\r
+void * I2C_get_user_data\r
+(\r
+    i2c_instance_t * this_i2c\r
+)\r
+{\r
+    return( this_i2c->p_user_data);\r
+}\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_i2c.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_i2c.h
new file mode 100644 (file)
index 0000000..2b1d5ac
--- /dev/null
@@ -0,0 +1,2280 @@
+/*******************************************************************************\r
+ * (c) Copyright 2009-2015 Microsemi SoC Products Group.  All rights reserved.\r
+ * \r
+ * CoreI2C software driver Application Programming Interface.\r
+ * This file contains defines and function declarations allowing to interface\r
+ * with the CoreI2C software driver.\r
+ * \r
+ * SVN $Revision: 7984 $\r
+ * SVN $Date: 2015-10-12 12:07:40 +0530 (Mon, 12 Oct 2015) $\r
+ */\r
+/*=========================================================================*//**\r
+  @mainpage CoreI2C Bare Metal Driver.\r
+   The CoreI2C bare metal software driver supports I2C master and slave\r
+   operations.\r
+\r
+  @section intro_sec Introduction\r
+  The CoreI2C driver provides a set of functions for controlling the Microsemi\r
+  CoreI2C hardware IP. The driver supports up to 16 separate I2C channels per\r
+  CoreI2C instance, with common slave address settings shared between channels\r
+  on a device.\r
+  \r
+  Optional features of the CoreI2C allow it operate with I2C based protocols\r
+  such as System Management Bus (SMBus), Power Management Bus (PMBus) and\r
+  Intelligent Platform Management Interface (IPMI). This driver provides support\r
+  for these features when enabled in the CoreI2C IP.\r
+  \r
+  The major features provided by CoreI2C driver are:\r
+    - Support for configuring the I2C channels of each CoreI2C peripheral.\r
+    - I2C master operations.\r
+    - I2C slave operations.\r
+    - SMBus related operations.\r
+\r
+  This driver can be used as part of a bare metal system where no operating \r
+  system  is available. The driver can be adapted for use as part of an \r
+  operating system, but the implementation of the adaptation layer between the \r
+  driver and  the operating system's driver model is outside the scope of this \r
+  driver.\r
+  \r
+  @section hw_dependencies Hardware Flow Dependencies\r
+  Your application software should configure the CoreI2C driver through\r
+  calls to the I2C_init() function for each CoreI2C instance in the\r
+  hardware design.  The configuration parameters include the CoreI2C hardware\r
+  instance base address and other runtime parameters, such as the I2C serial\r
+  clock frequency and I2C device address.\r
+  \r
+  Once channel 0 of a CoreI2C peripheral has been initialized via I2C_init(),\r
+  any additional channels present should be configured by calling\r
+  I2C_channel_init() for each of the remaining channels.\r
+  \r
+  No CoreI2C hardware configuration parameters are used by the driver, apart\r
+  from the CoreI2C hardware instance base address. Hence, no additional\r
+  configuration files are required to use the driver. \r
+  \r
+  Interrupt Control\r
+  The CoreI2C driver has to enable and disable the generation of interrupts by\r
+  CoreI2C at various times when it is operating. This enabling and disabling of\r
+  interrupts must be done through the system\92s interrupt controller. For that\r
+  reason, the method of controlling the CoreI2C interrupt is system specific\r
+  and it is necessary to customize the I2C_enable_irq() and I2C_disable_irq()\r
+  functions. These functions are found in the file i2c_interrupt.c. Their\r
+  default implementation fires an assertion to attract attention to the fact\r
+  that these functions must be modified.\r
+  \r
+  The implementation of the I2C_enable_irq() function should permit interrupts\r
+  generated by a CoreI2C instance to interrupt the processor. The implementation\r
+  of the I2C_disable_irq() function should prevent interrupts generated by a\r
+  CoreI2C instance from interrupting the processor. Please refer to the provided\r
+  example projects for a working implementation of these functions.\r
+  \r
+  The function I2C_register_write_handler() is used to register a write handler\r
+  function with the CoreI2C driver that it calls on completion of an I2C write\r
+  transaction by the CoreI2C slave. It is your responsibility to create and\r
+  register the implementation of this handler function that processes or\r
+  trigger the processing of the received data.\r
+  \r
+  The SMBSUS and SMBALERT interrupts are related to the SMBus interface and are\r
+  enabled and disabled through I2C_enable_smbus_irq() and \r
+  I2C_disable_smbus_irq() respectively. It is your responsibility to create\r
+  interrupt handler functions in your application to get the desired response\r
+  for the SMBus interrupts.\r
+\r
+  Note: You must include the path to any application header files that are\r
+        included in the i2c_interrupt.c file, as an include path in your\r
+        project\92s compiler settings. The details of how to do this will depend\r
+        on your development software.\r
+\r
+  SMBus Logic options\r
+  SMBus related APIs will not have any effect if in CoreI2C hardware\r
+  configuration "Generate SMBus Logic" is not enabled. The APIs which will not\r
+  give desired results in case SMBus Logic is disabled are:\r
+  \r
+      I2C_smbus_init()\r
+      I2C_reset_smbus()\r
+      I2C_enable_smbus_irq()\r
+      I2C_disable_smbus_irq()\r
+      I2C_suspend_smbus_slave()\r
+      I2C_resume_smbus_slave()\r
+      I2C_set_smsbus_alert()\r
+      I2C_clear_smsbus_alert()\r
+      I2C_get_irq_status() \r
+\r
+  Fixed Baud Rate Values\r
+  The serial clock frequency parameter passed to the I2C_init() and \r
+  I2C_channel_init() functions may not have any effect if fixed values were\r
+  selected for Baud rate in the hardware configuration of CoreI2C. When fixed\r
+  values are selected for these baud rates, the driver cannot overwrite\r
+  the fixed values.\r
+\r
+  Fixed Slave Address Options Values\r
+  The primary slave address  parameter passed to the I2C_init() function, and\r
+  secondary address value passed to the I2C_set_slave_second_addr() function,\r
+  may not have the desired effect if fixed values were selected for the slave 0\r
+  address and slave 1 address respectively. Proper operation of this version of\r
+  the driver requires the slave addresses to be programmable.\r
+\r
+  @section theory_op Theory of Operation\r
+  The CoreI2C software driver is designed to allow the control of multiple\r
+  instances of CoreI2C with one or more I2C channels. Each channel in an\r
+  instance of CoreI2C in the hardware design is associated with a single \r
+  instance of the i2c_instance_t structure in the software. You must allocate\r
+  memory for one unique i2c_instance_t structure instance for each channel of\r
+  each CoreI2C hardware instance. The contents of these data structures are\r
+  initialised during calls to I2C_init() and if necessary I2C_channel_init().\r
+  A pointer to the structure is passed to subsequent driver functions in order\r
+  to identify the CoreI2C hardware instance and channel you wish to perform the\r
+  requested operation.\r
+\r
+  Note: Do not attempt to directly manipulate the contents of i2c_instance_t\r
+       structures. These structures are only intended to be modified by the driver\r
+       functions.\r
+\r
+  The CoreI2C driver functions are grouped into the following categories:\r
+    - Initialization and configuration functions\r
+    - Interrupt control\r
+    - I2C slave addressing functions\r
+    - I2C master operations functions to handle write, read and write-read \r
+      transactions\r
+    - I2C slave operations functions to handle write, read and write-read \r
+      transactions\r
+    - Mixed master-slave operations \r
+    - SMBus interface configuration and control.\r
+    \r
+  Initialization and Configuration\r
+    The CoreI2C device is first initialized through a call to the I2C_init()\r
+    function. Since each CoreI2C peripheral supports up to 16 channels, an\r
+    additional function, I2C_channel_init(), is required to initialize the\r
+    remaining channels with their own data structures.\r
+\r
+    I2C_init() initializes channel 0 of a CoreI2C and the i2c_instance_t for\r
+    channel 0 acts as the basis for further channel initialization as the\r
+    hardware base address and I2C serial address are same across all the\r
+    channels. I2C_init() must be called before any other  I2C driver function\r
+    calls. The I2C_init() call for each CoreI2C takes the I2C serial address\r
+    assigned to the I2C and the serial clock divider to be used to generate its\r
+    I2C clock as configuration parameters. \r
+    \r
+    I2C_channel_init() takes as input parameters a pointer to the CoreI2C \r
+    i2c_instance_t which has been initialized via I2C_init() and a pointer to a\r
+    separate i2c_instance_t which represents this new channel. Another input\r
+    parameter which is required by this function is serial clock divider which\r
+    generates its I2C clock. \r
+    \r
+  Interrupt Control\r
+    The CoreI2C driver is interrupt driven and it uses each channels INT\r
+    interrupt to drive the state machine which is at the heart of the driver.\r
+    The application is responsible for providing the link between the interrupt\r
+    generating hardware and the CoreI2C interrupt handler and must ensure that\r
+    the I2C_isr() function is called with the correct i2c_instance_t structure\r
+    pointer for the CoreI2C channel initiating the interrupt.\r
+    \r
+    The driver enables and disables the generation of INT interrupts by CoreI2C\r
+    at various times when it is operating through the user supplied\r
+    I2C_enable_irq() and I2C_disable_irq() functions. \r
+    \r
+    The function I2C_register_write_handler() is used to register a write\r
+    handler function with the CoreI2C driver which is called on completion\r
+    of an I2C write transaction by the CoreI2C slave. It is the user\r
+    applications responsibility to create and register the implementation of\r
+    this handler function that processes or triggers the processing of the\r
+    received data. \r
+    \r
+    The other two interrupt sources in the CoreI2C, are related to SMBus\r
+    operation and are enabled and disabled through I2C_enable_smbus_irq() and\r
+    I2C_disable_smbus_irq() respectively. Due to the application specific\r
+    nature of the response to SMBus interrupts, you must design interrupt\r
+    handler functions in the application to get the desired behaviour for\r
+    SMBus related interrupts.\r
+    \r
+    If enabled, the SMBA_INT signal from the CoreI2C is asserted if an\r
+    SMBALERT condition is signalled on the SMBALERT_NI input for the channel.\r
+    \r
+    If enabled, the SMBS_INT signal from the CoreI2C is asserted if an\r
+    SMBSUSPEND condition is signalled on the SMBSUS_NI input for the channel.\r
+\r
+  I2C slave addressing functions\r
+    A CoreI2C peripheral can respond to three slave addresses:\r
+    - Slave address 0 - This is the primary slave address which is used for\r
+                        accessing a CoreI2C channel when it acts as a slave in\r
+                        I2C transactions. You must configure the primary slave\r
+                        address via I2C_init().\r
+                        \r
+    - Slave address 1 - This is the secondary slave address which might be\r
+                        required in certain application specific scenarios.\r
+                        The secondary slave address can be configured via\r
+                        I2C_set_slave_second_addr() and disabled via \r
+                        I2C_disable_slave_second_addr().\r
+                        \r
+    - General call address - A CoreI2C slave can be configured to respond to\r
+                        a broadcast command by a master transmitting the\r
+                        general call address of 0x00. Use the I2C_set_gca()\r
+                        function to enable the slave to respond to the general\r
+                        call address. If the CoreI2C slave is not required to\r
+                        respond to the general call address, disable this\r
+                        address by calling I2C_clear_gca().\r
+\r
+    Note: All channels on a CoreI2C instance share the same slave address logic.\r
+          This means that they cannot have separate slave addresses and rely on\r
+          the separate physical I2C bus connections to distinguish them.\r
+          \r
+  Transaction Types\r
+    The I2C driver is designed to handle three types of I2C transaction:\r
+      Write transactions\r
+      Read transactions\r
+      Write-read transactions\r
\r
+    Write transaction\r
+      The master I2C device initiates a write transaction by sending a START bit\r
+      as soon as the bus becomes free. The START bit is followed by the 7-bit\r
+      serial address of the target slave device followed by the read/write bit\r
+      indicating the direction of the transaction. The slave acknowledges the\r
+      receipt of it's address with an acknowledge bit. The master sends data one\r
+      byte at a time to the slave, which must acknowledge receipt of each byte\r
+      for the next byte to be sent. The master sends a STOP bit to complete the\r
+      transaction. The slave can abort the transaction by replying with a \r
+      non-acknowledge bit instead of an acknowledge.\r
+      \r
+      The application programmer can choose not to send a STOP bit at the end of\r
+      the transaction causing the next transaction to begin with a repeated \r
+      START bit.\r
+      \r
+    Read transaction\r
+      The master I2C device initiates a read transaction by sending a START bit\r
+      as soon as the bus becomes free. The START bit is followed by the 7-bit\r
+      serial address of the target slave device followed by the read/write bit\r
+      indicating the direction of the transaction. The slave acknowledges\r
+      receipt of it's slave address with an acknowledge bit. The slave sends\r
+      data one byte at a time to the master, which must acknowledge receipt of\r
+      each byte for the next byte to be sent. The master sends a non-acknowledge\r
+      bit following the last byte it wishes to read followed by a STOP bit.\r
+      \r
+      The application programmer can choose not to send a STOP bit at the end of\r
+      the transaction causing the next transaction to begin with a repeated \r
+      START bit.\r
\r
+    Write-read transaction\r
+      The write-read transaction is a combination of a write transaction\r
+      immediately followed by a read transaction. There is no STOP bit between\r
+      the write and read phases of a write-read transaction. A repeated START\r
+      bit is sent between the write and read phases.\r
+      \r
+      Whilst the write handler is being executed, the slave holds the clock line\r
+      low to stretch the clock until the response is ready.\r
+      \r
+      The write-read transaction is typically used to send a command or offset\r
+      in the write transaction specifying the logical data to be transferred\r
+      during the read phase.\r
+      \r
+      The application programmer can choose not to send a STOP bit at the end of\r
+      the transaction causing the next transaction to begin with a repeated\r
+      START bit.\r
+\r
+  Master Operations\r
+    The application can use the I2C_write(), I2C_read() and I2C_write_read()\r
+    functions to initiate an I2C bus transaction. The application can then wait\r
+    for the transaction to complete using the I2C_wait_complete() function\r
+    or poll the status of the I2C transaction using the I2C_get_status()\r
+    function until it returns a value different from I2C_IN_PROGRESS. The\r
+    I2C_system_tick() function can be used to set a time base for the\r
+    I2C_wait_complete() function\92s time out delay.\r
+\r
+  Slave Operations\r
+    The configuration of the  I2C driver to operate as an I2C slave requires\r
+    the use of the following functions:\r
+       I2C_set_slave_tx_buffer()\r
+       I2C_set_slave_rx_buffer()\r
+       I2C_set_slave_mem_offset_length()\r
+       I2C_register_write_handler()\r
+       I2C_enable_slave()\r
+       \r
+    Use of all functions is not required if the slave I2C does not need to support\r
+    all types of I2C read transactions. The subsequent sections list the functions\r
+    that must be used to support each transaction type. \r
+    \r
+    Responding to read transactions\r
+      The following functions are used to configure the  CoreI2C driver to\r
+      respond to I2C read transactions:\r
+        I2C_set_slave_tx_buffer()\r
+        I2C_enable_slave()\r
+        \r
+      The function I2C_set_slave_tx_buffer() specifies the data buffer that\r
+      will be transmitted when the I2C slave is the target of an I2C read\r
+      transaction. It is then up to the application to manage the content of\r
+      that buffer to control the data that will be transmitted to the I2C\r
+      master as a result of the read transaction.\r
+      \r
+      The function I2C_enable_slave() enables the  I2C hardware instance\r
+      to respond to I2C transactions. It must be called after the  I2C driver\r
+      has been configured to respond to the required transaction types.\r
+\r
+    Responding to write transactions\r
+      The following functions are used to configure the  I2C driver to respond\r
+      to I2C write transactions:\r
+        I2C_set_slave_rx_buffer()\r
+        I2C_register_write_handler()\r
+        I2C_enable_slave()\r
+        \r
+      The function I2C_set_slave_rx_buffer() specifies the data buffer that\r
+      will be used to store the data received by the I2C slave when it is the\r
+      target an I2C  write transaction.\r
+      \r
+      The function I2C_register_write_handler() specifies the handler function\r
+      that must be called on completion of the I2C write transaction. It is this\r
+      handler function that processes or triggers the processing of the received\r
+      data.\r
+      \r
+      The function I2C_enable_slave() enables the  I2C hardware instance\r
+      to respond to I2C transactions. It must be called after the  I2C driver\r
+      has been configured to respond to the required transaction types.\r
+\r
+    Responding to write-read transactions\r
+      The following functions are used to configure the CoreI2C driver to \r
+      respond to write-read transactions:\r
+        I2C_set_slave_mem_offset_length()\r
+        I2C_set_slave_tx_buffer()\r
+        I2C_set_slave_rx_buffer()\r
+        I2C_register_write_handler()\r
+        I2C_enable_slave()\r
+        \r
+      The function I2C_set_slave_mem_offset_length() specifies the number of\r
+      bytes expected by the I2C slave during the write phase of the write-read\r
+      transaction.\r
+      \r
+      The function I2C_set_slave_tx_buffer() specifies the data that will be\r
+      transmitted to the I2C master during the read phase of the write-read\r
+      transaction. The value received by the I2C slave during the write phase of\r
+      the transaction will be used as an index into the transmit buffer\r
+      specified by this function to decide which part of the transmit buffer\r
+      will be transmitted to the I2C master as part of the read phase of the\r
+      write-read transaction. \r
+      \r
+      The function I2C_set_slave_rx_buffer() specifies the data buffer that\r
+      will be used to store the data received by the I2C slave during the write\r
+      phase of the write-read transaction. This buffer must be at least large\r
+      enough to accommodate the number of bytes specified through the\r
+      I2C_set_slave_mem_offset_length() function.\r
+      \r
+      The function I2C_register_write_handler() can optionally be used to\r
+      specify a handler function that is called on completion of the write phase\r
+      of the I2C write-read transaction. If a handler function is registered, it\r
+      is responsible for processing the received data in the slave receive\r
+      buffer and populating the slave transmit buffer with the data that will be\r
+      transmitted to the I2C master as part of the read phase of the write-read\r
+      transaction.\r
+      \r
+      The function I2C_enable_slave() enables the CoreI2C hardware instance to \r
+      respond to I2C transactions. It must be called after the CoreI2C driver\r
+      has been configured to respond to the required transaction types.\r
+\r
+  Mixed Master-Slave Operations\r
+    The CoreI2C device supports mixed master and slave operations. If the \r
+    CoreI2C slave has a transaction in progress and your application attempts to\r
+    begin a master mode transaction, the CoreI2C driver queu3es the master mode\r
+    transaction until the bus is released and the CoreI2C can switch to master\r
+    mode and acquire the bus. The CoreI2C master then starts the previously\r
+    queued master transaction.\r
+    \r
+  SMBus Control\r
+    The CoreI2C driver enables the CoreI2C peripheral\92s SMBus functionality\r
+    using the I2C_smbus_init() function.\r
+    \r
+    The I2C_suspend_smbus_slave() function is used, with a master mode CoreI2C,\r
+    to force slave devices on the SMBus to enter their power-down/suspend mode.\r
+    The I2C_resume_smbus_slave() function is used to end the suspend operation\r
+    on the SMBus.\r
+    \r
+    The I2C_reset_smbus() function is used, with a master mode CoreI2C, to force\r
+    all devices on the SMBus to reset their SMBUs interface.\r
+    \r
+    The I2C_set_smsbus_alert() function is used, by a slave mode CoreI2C, to\r
+    force communication with the SMBus master. Once communications with the\r
+    master is initiated, the I2C_clear_smsbus_alert() function is used to clear\r
+    the alert condition.\r
+    \r
+    The I2C_enable_smbus_irq() and I2C_disable_smbus_irq() functions are used to\r
+    enable and disable the SMBSUS and SMBALERT SMBus interrupts.\r
+\r
+ *//*=========================================================================*/\r
+\r
+#ifndef CORE_I2C_H_\r
+#define CORE_I2C_H_\r
+\r
+#include "cpu_types.h"\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif \r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_RELEASE_BUS constant is used to specify the options parameter to\r
+  functions I2C_read(), I2C_write() and I2C_write_read() to indicate\r
+  that a STOP bit must be generated at the end of the I2C transaction to release\r
+  the bus.\r
+ */\r
+#define I2C_RELEASE_BUS     0x00u\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_HOLD_BUS constant is used to specify the options parameter to\r
+  functions I2C_read(), I2C_write() and I2C_write_read() to indicate\r
+  that a STOP bit must not be generated at the end of the I2C transaction in\r
+  order to retain the bus ownership. This causes the next transaction to\r
+  begin with a repeated START bit and no STOP bit between the transactions.\r
+ */\r
+#define I2C_HOLD_BUS        0x01u\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The following constants specify the interrupt identifier number which will be\r
+  solely used by driver API. This has nothing to do with hardware interrupt line.\r
+  I2C_INT_IRQ is the primary interrupt signal which drives the state machine\r
+  of the CoreI2C driver. The I2C_SMBALERT_IRQ and I2C_SMBUS_IRQ are used by\r
+  SMBus interrupt enable and disable functions. These IRQ numbers are also used\r
+  by I2C_get_irq_status().\r
+ */\r
+#define I2C_NO_IRQ             0x00u\r
+#define I2C_SMBALERT_IRQ       0x01u\r
+#define I2C_SMBSUS_IRQ         0x02u\r
+#define I2C_INTR_IRQ           0x04u\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_NO_TIMEOUT constant is used as parameter to the I2C_wait_complete()\r
+  function to indicate that the wait for completion of the transaction should\r
+  not time out.\r
+ */\r
+#define I2C_NO_TIMEOUT  0u\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The i2c_channel_number_t type is used to specify the channel number of a\r
+  CoreI2C instance.\r
+ */\r
+typedef enum i2c_channel_number {\r
+    I2C_CHANNEL_0 = 0u,\r
+    I2C_CHANNEL_1,\r
+    I2C_CHANNEL_2,\r
+    I2C_CHANNEL_3,\r
+    I2C_CHANNEL_4,\r
+    I2C_CHANNEL_5,\r
+    I2C_CHANNEL_6,\r
+    I2C_CHANNEL_7,\r
+    I2C_CHANNEL_8,\r
+    I2C_CHANNEL_9,\r
+    I2C_CHANNEL_10,\r
+    I2C_CHANNEL_11,\r
+    I2C_CHANNEL_12,\r
+    I2C_CHANNEL_13,\r
+    I2C_CHANNEL_14,\r
+    I2C_CHANNEL_15,\r
+    I2C_MAX_CHANNELS = 16u\r
+} i2c_channel_number_t;\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The i2c_clock_divider_t type is used to specify the divider to be applied\r
+  to the I2C PCLK or BCLK signal in order to generate the I2C clock.\r
+  The I2C_BCLK_DIV_8 value selects a clock frequency based on division of BCLK,\r
+  all other values select a clock frequency based on division of PCLK.\r
+ */\r
+typedef enum i2c_clock_divider {\r
+    I2C_PCLK_DIV_256 = 0u,\r
+    I2C_PCLK_DIV_224,\r
+    I2C_PCLK_DIV_192,\r
+    I2C_PCLK_DIV_160,\r
+    I2C_PCLK_DIV_960,\r
+    I2C_PCLK_DIV_120,\r
+    I2C_PCLK_DIV_60,\r
+    I2C_BCLK_DIV_8\r
+} i2c_clock_divider_t;\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The i2c_status_t type is used to report the status of I2C transactions.\r
+ */\r
+typedef enum i2c_status\r
+{\r
+    I2C_SUCCESS = 0u,\r
+    I2C_IN_PROGRESS,\r
+    I2C_FAILED,\r
+    I2C_TIMED_OUT\r
+} i2c_status_t;\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The i2c_slave_handler_ret_t type is used by slave write handler functions\r
+  to indicate whether or not the received data buffer should be released.\r
+ */\r
+typedef enum i2c_slave_handler_ret {\r
+    I2C_REENABLE_SLAVE_RX = 0u,\r
+    I2C_PAUSE_SLAVE_RX = 1u\r
+} i2c_slave_handler_ret_t;\r
+\r
+typedef struct i2c_instance i2c_instance_t ;\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  Slave write handler functions prototype.\r
+  ------------------------------------------------------------------------------\r
+  This defines the function prototype that must be followed by  I2C slave write\r
+  handler functions. These functions are registered with the CoreI2C driver\r
+  through the I2C_register_write_handler() function.\r
+\r
+  Declaring and Implementing Slave Write Handler Functions:\r
+    Slave write handler functions should follow the following prototype:\r
+    i2c_slave_handler_ret_t write_handler\r
+    ( \r
+        i2c_instance_t *instance, uint8_t * data, uint16_t size \r
+    );\r
+\r
+    The instance parameter is a pointer to the i2c_instance_t for which this\r
+    slave write handler has been declared.\r
+    \r
+    The data parameter is a pointer to a buffer (received data buffer) holding\r
+    the data written to the I2C slave.\r
+    \r
+    Defining the macro INCLUDE_SLA_IN_RX_PAYLOAD causes the driver to insert the\r
+    actual address used to access the slave as the first byte in the buffer.\r
+    This allows applications tailor their response based on the actual address\r
+    used to access the slave (primary address, secondary address or GCA).\r
+    \r
+    The size parameter is the number of bytes held in the received data buffer.\r
+    Handler functions must return one of the following values:\r
+        I2C_REENABLE_SLAVE_RX\r
+        I2C_PAUSE_SLAVE_RX.\r
+        \r
+    If the handler function returns I2C_REENABLE_SLAVE_RX, the driver releases\r
+    the received data buffer and allows further I2C write transactions to the\r
+    I2C slave to take place.\r
+    \r
+    If the handler function returns I2C_PAUSE_SLAVE_RX, the I2C slave responds\r
+    to subsequent write requests with a non-acknowledge bit (NACK), until the\r
+    received data buffer content has been processed by some other part of the\r
+    software application.\r
+    \r
+    A call to I2C_enable_slave() is required at some point after returning\r
+    I2C_PAUSE_SLAVE_RX in order to release the received data buffer so it can\r
+    be used to store data received by subsequent I2C write transactions.\r
+ */\r
+typedef i2c_slave_handler_ret_t (*i2c_slave_wr_handler_t)(i2c_instance_t *instance, uint8_t *, uint16_t );\r
+\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  i2c_instance_t\r
+  ------------------------------------------------------------------------------\r
+  This structure is used to identify the various CoreI2C hardware instances in\r
+  your system and the I2C channels within them. Your application software should\r
+  declare one instance of this structure for each channel of each instance of\r
+  CoreI2C in your system. The functions I2C_init() and I2C_channel_init() \r
+  initialize this structure depending on whether it is channel 0 or one of the\r
+  additional channels respectively. A pointer to an initialized instance of the\r
+  structure should be passed as the first parameter to the CoreI2C driver\r
+  functions, to identify which CoreI2C hardware instance and channel should\r
+  perform the requested operation.\r
+  \r
+  The contents of this data structure should not be modified or used outside of\r
+  the CoreI2C driver. Software using the CoreI2C driver should only need to \r
+  create one single instance of this data structure for each channel of each \r
+  CoreI2C hardware instance in the system then pass a pointer to these data\r
+  structures with each call to the CoreI2C driver in order to identify the\r
+  CoreI2C hardware instance it wishes to use.\r
+ */\r
+struct i2c_instance\r
+{\r
+    addr_t base_address;\r
+    uint_fast8_t ser_address;\r
+\r
+    /* Transmit related info:*/\r
+    uint_fast8_t target_addr;\r
+\r
+    /* Current transaction type (WRITE, READ, RANDOM_READ)*/\r
+    uint8_t transaction;\r
+    \r
+    uint_fast16_t random_read_addr;\r
+\r
+    uint8_t options;\r
+    \r
+    /* Master TX INFO: */\r
+    const uint8_t * master_tx_buffer;\r
+    uint_fast16_t master_tx_size;\r
+    uint_fast16_t master_tx_idx;\r
+    uint_fast8_t dir;\r
+    \r
+    /* Master RX INFO: */\r
+    uint8_t * master_rx_buffer;\r
+    uint_fast16_t master_rx_size;\r
+    uint_fast16_t master_rx_idx;\r
+\r
+    /* Master Status */\r
+    volatile i2c_status_t master_status;\r
+    uint32_t master_timeout_ms;\r
+\r
+    /* Slave TX INFO */\r
+    const uint8_t * slave_tx_buffer;\r
+    uint_fast16_t slave_tx_size;\r
+    uint_fast16_t slave_tx_idx;\r
+    \r
+    /* Slave RX INFO */\r
+    uint8_t * slave_rx_buffer;\r
+    uint_fast16_t slave_rx_size;\r
+    uint_fast16_t slave_rx_idx;\r
+    /* Slave Status */\r
+    volatile i2c_status_t slave_status;\r
+    \r
+    /* Slave data: */\r
+    uint_fast8_t slave_mem_offset_length;\r
+    i2c_slave_wr_handler_t slave_write_handler;\r
+    uint8_t is_slave_enabled;\r
+    \r
+    /* user  specific data */\r
+    void *p_user_data ;\r
+\r
+    /* I2C bus status */\r
+    uint8_t bus_status;\r
+\r
+    /* Is transaction pending flag */\r
+    uint8_t is_transaction_pending;\r
+\r
+    /* I2C Pending transaction */\r
+    uint8_t pending_transaction;\r
+};\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  I2C initialization routine.\r
+  ------------------------------------------------------------------------------\r
+  The I2C_init() function is used to configure channel 0 of a CoreI2C instance.\r
+  It sets the base hardware address which is used to locate the CoreI2C instance\r
+  in memory and also used internally by I2C_channel_init() to calculate the\r
+  register addresses for any additional channels. The slave serial address set\r
+  is shared by all channels on a CoreI2C instance. \r
+  \r
+  If only one channel is configured in a CoreI2C, the address of the \r
+  i2c_instance_t used in I2C_Init() will also be used in subsequent calls to the\r
+  CoreI2C driver functions. If more than one channel is configured in the\r
+  CoreI2C, I2C_channel_init() will be called after I2C_init(), which initializes\r
+  the i2c_instance_t data structure for a specific channel.\r
+  ------------------------------------------------------------------------------\r
+ @param this_i2c:\r
+    Pointer to the i2c_instance_t data structure which will hold all data\r
+    related to channel 0 of the CoreI2C instance being initialized. A pointer\r
+    to this structure will be used in all subsequent calls to CoreI2C driver\r
+    functions which are to operate on channel 0 of this CoreI2C instance.\r
+  \r
+  @param base_address:\r
+    Base address in the processor's memory map of the registers of the CoreI2C\r
+    instance being initialized.\r
\r
+  @param ser_address:\r
+    This parameter sets the primary I2C serial address (SLAVE0 address) for the\r
+    CoreI2C being initialized. It is the principal I2C bus address to which the\r
+    CoreI2C instance will respond. CoreI2C can operate in master mode or slave\r
+    mode and the serial address is significant only in the case of I2C slave\r
+    mode. In master mode, CoreI2C does not require a serial address and the\r
+    value of this parameter is not important. If you do not intend to use the\r
+    CoreI2C device in slave mode, then any dummy slave address value can be\r
+    provided to this parameter. However, in systems where the CoreI2C may be\r
+    expected to switch from master mode to slave mode, it is advisable to\r
+    initialize the CoreI2C device with a valid serial slave address.\r
+    \r
+    You need to call the I2C_init() function whenever it is required to change \r
+    the primary slave address as there is no separate function to set the\r
+    primary slave address of the I2C device. The serial address being\r
+    initialized through this function is basically the primary slave address or\r
+    slave address0. I2C_set_slave_second_addr() can be used to set the\r
+    secondary slave address or slave address 1.\r
+    Note : ser_address parameter does not have any affect if fixed slave \r
+           address is enabled in CoreI2C hardware design. CoreI2C will \r
+           be always addressed with the hardware configured fixed slave\r
+           address.\r
+    Note : ser_address parameter will not have any affect if the CoreI2C\r
+           instance is only used in master mode.\r
+\r
+  @param ser_clock_speed:\r
+    This parameter sets the I2C serial clock frequency. It selects the divider\r
+    that will be used to generate the serial clock from the APB PCLK or from\r
+    the BCLK. It can be one of the following:\r
+        I2C_PCLK_DIV_256\r
+        I2C_PCLK_DIV_224\r
+        I2C_PCLK_DIV_192\r
+        I2C_PCLK_DIV_160\r
+        I2C_PCLK_DIV_960\r
+        I2C_PCLK_DIV_120\r
+        I2C_PCLK_DIV_60\r
+        I2C_BCLK_DIV_8\r
+    Note: serial_clock_speed value will have no affect if Fixed baud rate is \r
+          enabled in CoreI2C hardware instance configuration dialogue window. \r
+          The fixed baud rate divider value will override the value\r
+          passed as parameter in this function.\r
+    Note: serial_clock_speed value is not critical for devices that only operate\r
+          as slaves and can be set to any of the above values.  \r
+\r
+  @return none.  \r
+  \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define COREI2C_SER_ADDR   0x10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    void system_init( void )\r
+    {\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_SER_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_init\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    addr_t base_address,\r
+    uint8_t ser_address,\r
+    i2c_clock_divider_t ser_clock_speed\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  I2C channel initialization routine.\r
+  ------------------------------------------------------------------------------\r
+  The I2C_channel_init() function initializes and configures hardware and data\r
+  structures of one of the additional channels of a CoreI2C instance.\r
+  I2C_init() must be called before calling this function to set the CoreI2C\r
+  instance hardware base address and I2C serial address. I2C_channel_init() also\r
+  initializes I2C serial clock divider to set the serial clock baud rate.  \r
+  The pointer to data structure i2c_instance_t used for a particular channel\r
+  will be used as an input parameter to subsequent CoreI2C driver functions\r
+  which operate on this channel.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c_channel\r
+    Pointer to the i2c_instance_t data structure holding all data related to the\r
+    CoreI2C channel being initialized. A pointer to the same data structure will\r
+    be used in subsequent calls to the CoreI2C driver functions in order to\r
+    identify the CoreI2C channel instance that should perform the operation \r
+    implemented by the called driver function.\r
+\r
+  @param this_i2c:\r
+    This is a pointer to an i2c_instance_t structure previously initialized by\r
+    I2C_init(). It holds information regarding the hardware base address and\r
+    I2C serial address for the CoreI2C containing the channel to be\r
+    initialized. This information is required by I2C_channel_init() to\r
+    initialize the i2c_instance_t structure pointed to by this_i2c_channel as\r
+    all channels in a CoreI2C instance share the same base address and serial\r
+    address. It is very important that the i2c_instance_t structure pointed to\r
+    by this_i2c has been previously initialized with a call to I2C_init().\r
+    \r
+  @param channel_number:\r
+    This parameter of type i2c_channel_number_t identifies the channel to be\r
+    initialized.\r
+\r
+  @param ser_clock_speed:\r
+    This parameter sets the I2C serial clock frequency. It selects the divider\r
+    that will be used to generate the serial clock from the APB PCLK or from\r
+    the BCLK. It can be one of the following:\r
+        I2C_PCLK_DIV_256\r
+        I2C_PCLK_DIV_224\r
+        I2C_PCLK_DIV_192\r
+        I2C_PCLK_DIV_160\r
+        I2C_PCLK_DIV_960\r
+        I2C_PCLK_DIV_120\r
+        I2C_PCLK_DIV_60\r
+        I2C_BCLK_DIV_8\r
+    \r
+    Note: serial_clock_speed value will have no affect if Fixed baud rate is \r
+          enabled in CoreI2C hardware instance configuration dialogue window. \r
+          The fixed baud rate divider value will supersede the value \r
+          passed as parameter in this function.\r
+\r
+    Note: ser_clock_speed value is not critical for devices that only operate\r
+          as slaves and can be set to any of the above values.  \r
+  @return none.  \r
+  \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define COREI2C_SER_ADDR   0x10u\r
+    #define DATA_LENGTH        16u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+    i2c_instance_t g_i2c_channel_1_inst;\r
+\r
+    uint8_t  tx_buffer[DATA_LENGTH];\r
+    uint8_t  write_length = DATA_LENGTH;\r
+\r
+    void system_init( void )\r
+    {\r
+        uint8_t  target_slave_addr = 0x12;\r
+        \r
+        // Initialize base CoreI2C instance\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_SER_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+        \r
+        // Initialize CoreI2C channel 1 with different clock speed\r
+        I2C_channel_init( &g_i2c_channel_1_inst, &g_i2c_inst, I2C_CHANNEL_1,\r
+                          I2C_PCLK_DIV_224 );\r
+        \r
+        // Write data to Channel 1 of CoreI2C instance.\r
+        I2C_write( &g_i2c_channel_1_inst, target_slave_addr, tx_buffer,\r
+                   write_length, I2C_RELEASE_BUS );\r
+    }\r
+  @endcode\r
+          \r
+*/\r
+void I2C_channel_init\r
+(\r
+    i2c_instance_t * this_i2c_channel,\r
+    i2c_instance_t * this_i2c,\r
+    i2c_channel_number_t channel_number,\r
+    i2c_clock_divider_t ser_clock_speed\r
+);\r
+\r
+/*------------------------------------------------------------------------------\r
+  CoreI2C interrupt service routine.\r
+  ------------------------------------------------------------------------------\r
+    The function I2C_isr is the CoreI2C interrupt service routine. User must\r
+    call this function from their application level CoreI2C interrupt handler\r
+    function. This function runs the I2C state machine based on previous and \r
+    current status.\r
+  ------------------------------------------------------------------------------\r
+    @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+    \r
+    @return none\r
+    \r
+    Example:\r
+    @code\r
+    \r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define COREINTERRUPT_BASE_ADDR  0xCC000000u\r
+    #define COREI2C_SER_ADDR   0x10u\r
+    #define I2C_IRQ_NB           2u\r
+    \r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    void core_i2c_isr( void )\r
+    {\r
+       I2C_isr( &g_i2c_inst );\r
+    }\r
+    \r
+   void main( void )\r
+    {\r
+        CIC_init( COREINTERRUPT_BASE_ADDR );\r
+        NVIC_init();\r
+        CIC_set_irq_handler( I2C_IRQ_NB, core_i2c_isr );\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_SER_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+        NVIC_enable_interrupt( NVIC_IRQ_0 );\r
+    }\r
+    @endcode\r
+ */\r
+void I2C_isr\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*******************************************************************************\r
+ *******************************************************************************\r
+ * \r
+ *                           Master specific functions\r
+ * \r
+ * The following functions are only used within an I2C master's implementation.\r
+ */\r
\r
+/*-------------------------------------------------------------------------*//**\r
+  I2C master write function.\r
+  ------------------------------------------------------------------------------\r
+  This function initiates an I2C master write transaction. This function returns\r
+  immediately after initiating the transaction. The content of the write buffer\r
+  passed as parameter should not be modified until the write transaction\r
+  completes. It also means that the memory allocated for the write buffer should\r
+  not be freed or should not go out of scope before the write completes. You can\r
+  check for the write transaction completion using the I2C_status() function.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @param serial_addr:\r
+    This parameter specifies the serial address of the target I2C device.\r
+  \r
+  @param write_buffer:\r
+    This parameter is a pointer to a buffer holding the data to be written to\r
+    the target I2C device.\r
+    Care must be taken not to release the memory used by this buffer before the\r
+    write transaction completes. For example, it is not appropriate to return\r
+    from a function allocating this buffer as an auto array variable before the\r
+    write transaction completes as this would result in the buffer's memory \r
+    being de-allocated from the stack when the function returns. This memory\r
+    could then be subsequently reused and modified causing unexpected data to \r
+    be written to the target I2C device.\r
+  \r
+  @param write_size:\r
+    Number of bytes held in the write_buffer to be written to the target I2C\r
+    device.\r
\r
+  @param options:\r
+    The options parameter is used to indicate if the I2C bus should be released\r
+    on completion of the write transaction. Using the I2C_RELEASE_BUS\r
+    constant for the options parameter causes a STOP bit to be generated at the\r
+    end of the write transaction causing the bus to be released for other I2C\r
+    devices to use. Using the I2C_HOLD_BUS constant as options parameter\r
+    prevents a STOP bit from being generated at the end of the write\r
+    transaction, preventing other I2C devices from initiating a bus transaction.\r
+  \r
+  @return none.  \r
+  \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define COREI2C_DUMMY_ADDR   0x10u\r
+    #define DATA_LENGTH           16u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    uint8_t  tx_buffer[DATA_LENGTH];\r
+    uint8_t  write_length = DATA_LENGTH;     \r
+\r
+    void main( void )\r
+    {\r
+        uint8_t  target_slave_addr = 0x12;\r
+        i2c_status_t status;\r
+        \r
+        // Initialize base CoreI2C instance\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_DUMMY_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+        \r
+        // Write data to Channel 0 of CoreI2C instance.\r
+        I2C_write( &g_i2c_inst, target_slave_addr, tx_buffer, write_length,\r
+                   I2C_RELEASE_BUS );\r
+                   \r
+        // Wait for completion and record the outcome\r
+        status = I2C_wait_complete( &g_i2c_inst, I2C_NO_TIMEOUT );\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_write\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t serial_addr,\r
+    const uint8_t * write_buffer,\r
+    uint16_t write_size,\r
+    uint8_t options\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  I2C master read.\r
+  ------------------------------------------------------------------------------\r
+  This function initiates an I2C master read transaction. This function returns\r
+  immediately after initiating the transaction.\r
+  The contents of the read buffer passed as parameter should not be modified\r
+  until the read transaction completes. It also means that the memory allocated\r
+  for the read buffer should not be freed or should not go out of scope before\r
+  the read completes. You can check for the read transaction completion using \r
+  the I2C_status() function.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+  \r
+  @param serial_addr:\r
+    This parameter specifies the serial address of the target I2C device.\r
+  \r
+  @param read_buffer\r
+    This is a pointer to a buffer where the data received from the target device\r
+    will be stored.\r
+    Care must be taken not to release the memory used by this buffer before the\r
+    read transaction completes. For example, it is not appropriate to return\r
+    from a function allocating this buffer as an auto array variable before the\r
+    read transaction completes as this would result in the buffer's memory being\r
+    de-allocated from the stack when the function returns. This memory could\r
+    then be subsequently reallocated resulting in the read transaction\r
+    corrupting the newly allocated memory. \r
+\r
+  @param read_size:\r
+    This parameter specifies the number of bytes to read from the target device.\r
+    This size must not exceed the size of the read_buffer buffer.\r
\r
+  @param options:\r
+    The options parameter is used to indicate if the I2C bus should be released\r
+    on completion of the read transaction. Using the I2C_RELEASE_BUS\r
+    constant for the options parameter causes a STOP bit to be generated at the\r
+    end of the read transaction causing the bus to be released for other I2C\r
+    devices to use. Using the I2C_HOLD_BUS constant as options parameter\r
+    prevents a STOP bit from being generated at the end of the read transaction,\r
+    preventing other I2C devices from initiating a bus transaction.\r
+    \r
+  @return none.  \r
+  \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define COREI2C_DUMMY_ADDR   0x10u\r
+    #define DATA_LENGTH           16u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    uint8_t  rx_buffer[DATA_LENGTH];\r
+    uint8_t  read_length = DATA_LENGTH;     \r
+\r
+    void main( void )\r
+    {\r
+        uint8_t  target_slave_addr = 0x12;\r
+        i2c_status_t status;\r
+        \r
+        // Initialize base CoreI2C instance\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_DUMMY_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+        \r
+        // Read data from target slave Channel 0 of CoreI2C instance.\r
+        I2C_read( &g_i2c_inst, target_slave_addr, rx_buffer, read_length,\r
+                  I2C_RELEASE_BUS );\r
+        \r
+        status = I2C_wait_complete( &g_i2c_inst, I2C_NO_TIMEOUT );\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_read\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t serial_addr,\r
+    uint8_t * read_buffer,\r
+    uint16_t read_size,\r
+    uint8_t options\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  I2C master write-read\r
+  ------------------------------------------------------------------------------\r
+  This function initiates an I2C write-read transaction where data is first\r
+  written to the target device before issuing a restart condition and changing\r
+  the direction of the I2C transaction in order to read from the target device.\r
+  \r
+  The same warnings about buffer allocation in I2C_write() and I2C_read() \r
+  apply to this function.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of\r
+    channel 0 of the instantiated CoreI2C hardware.\r
+  \r
+  @param serial_addr:\r
+    This parameter specifies the serial address of the target I2C device.\r
+  \r
+  @param addr_offset:\r
+    This parameter is a pointer to the buffer containing the data that will be\r
+    sent to the slave during the write phase of the write-read transaction. This\r
+    data is typically used to specify an address offset specifying to the I2C\r
+    slave device what data it must return during the read phase of the\r
+    write-read transaction.\r
+  \r
+  @param offset_size:\r
+    This parameter specifies the number of offset bytes to be written during the\r
+    write phase of the write-read transaction. This is typically the size of the\r
+    buffer pointed to by the addr_offset parameter.\r
+  \r
+  @param read_buffer:\r
+    This parameter is a pointer to the buffer where the data read from the I2C\r
+    slave will be stored.\r
+  \r
+  @param read_size:\r
+    This parameter specifies the number of bytes to read from the target I2C\r
+    slave device. This size must not exceed the size of the buffer pointed to by\r
+    the read_buffer parameter.\r
\r
+  @param options:\r
+    The options parameter is used to indicate if the I2C bus should be released\r
+    on completion of the write-read transaction. Using the I2C_RELEASE_BUS\r
+    constant for the options parameter causes a STOP bit to be generated at the\r
+    end of the write-read transaction causing the bus to be released for other\r
+    I2C devices to use. Using the I2C_HOLD_BUS constant as options parameter\r
+    prevents a STOP bit from being generated at the end of the write-read\r
+    transaction, preventing other I2C devices from initiating a bus transaction.\r
+        \r
+  @return none.  \r
+  \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR    0xC0000000u\r
+    #define COREI2C_DUMMY_ADDR   0x10u\r
+    #define TX_LENGTH            16u\r
+    #define RX_LENGTH            8u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+    uint8_t  rx_buffer[RX_LENGTH];\r
+    uint8_t  read_length = RX_LENGTH;     \r
+    uint8_t  tx_buffer[TX_LENGTH];\r
+    uint8_t  write_length = TX_LENGTH;  \r
+    \r
+    void main( void )\r
+    {\r
+        uint8_t  target_slave_addr = 0x12;\r
+        i2c_status_t status;\r
+        // Initialize base CoreI2C instance\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_DUMMY_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+                  \r
+        I2C_write_read( &g_i2c_inst, target_slave_addr, tx_buffer, write_length,\r
+                        rx_buffer, read_length, I2C_RELEASE_BUS );\r
+                        \r
+        status = I2C_wait_complete( &g_i2c_inst, I2C_NO_TIMEOUT );\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_write_read\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t serial_addr,\r
+    const uint8_t * addr_offset,\r
+    uint16_t offset_size,\r
+    uint8_t * read_buffer,\r
+    uint16_t read_size,\r
+    uint8_t options\r
+);\r
+    \r
+/*-------------------------------------------------------------------------*//**\r
+  I2C status\r
+  ------------------------------------------------------------------------------\r
+  This function indicates the current state of a CoreI2C channel.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+  ------------------------------------------------------------------------------\r
+  @return\r
+    The return value indicates the current state of a CoreI2C channel or the\r
+    outcome of the previous transaction if no transaction is in progress. \r
+    Possible return values are:\r
+      I2C_SUCCESS\r
+        The last I2C transaction has completed successfully.  \r
+      I2C_IN_PROGRESS\r
+        There is an I2C transaction in progress.\r
+      I2C_FAILED\r
+        The last I2C transaction failed.\r
+      I2C_TIMED_OUT\r
+        The request has failed to complete in the allotted time.      \r
+  \r
+  Example:\r
+  @code\r
+    i2c_instance_t g_i2c_inst;\r
+    \r
+    while( I2C_IN_PROGRESS == I2C_get_status( &g_i2c_inst ) )\r
+    {\r
+        // Do something useful while waiting for I2C operation to complete\r
+        our_i2c_busy_task();\r
+    }\r
+    \r
+    if( I2C_SUCCESS != I2C_get_status( &g_i2c_inst ) )\r
+    {\r
+        // Something went wrong... \r
+        our_i2c_error_recovery( &g_i2c_inst );\r
+    }\r
+  @endcode\r
+ */\r
+i2c_status_t I2C_get_status\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  Wait for I2C transaction completion.\r
+  ------------------------------------------------------------------------------\r
+  This function waits for the current I2C transaction to complete. The return\r
+  value indicates whether the last I2C transaction was successful or not.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of\r
+    channel 0 of the instantiated CoreI2C hardware.\r
+  @param timeout_ms:\r
+    The timeout_ms parameter specified the delay within which the current I2C \r
+    transaction is expected to complete. The time out delay is given in \r
+    milliseconds. I2C_wait_complete() will return I2C_TIMED_OUT if the current\r
+    transaction has not completed after the time out delay has expired. This\r
+    parameter can be set to I2C_NO_TIMEOUT to indicate that I2C_wait_complete()\r
+    must not time out.\r
+  ------------------------------------------------------------------------------\r
+  @return\r
+    The return value indicates the outcome of the last I2C transaction. It can\r
+    be one of the following: \r
+      I2C_SUCCESS\r
+        The last I2C transaction has completed successfully.\r
+      I2C_FAILED\r
+        The last I2C transaction failed.\r
+      I2C_TIMED_OUT\r
+        The last transaction failed to complete within the time out delay given\r
+        as second parameter.\r
+\r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define COREI2C_DUMMY_ADDR   0x10u\r
+    #define DATA_LENGTH           16u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    uint8_t  rx_buffer[DATA_LENGTH];\r
+    uint8_t  read_length = DATA_LENGTH;     \r
+\r
+    void main( void )\r
+    {\r
+        uint8_t  target_slave_addr = 0x12;\r
+        i2c_status_t status;\r
+        \r
+        // Initialize base CoreI2C instance\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, COREI2C_DUMMY_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+        \r
+        // Read data from Channel 0 of CoreI2C instance.\r
+        I2C_read( &g_i2c_inst, target_slave_addr, rx_buffer, read_length,\r
+                  I2C_RELEASE_BUS );\r
+        \r
+        // Wait for completion and record the outcome\r
+        status = I2C_wait_complete( &g_i2c_inst, I2C_NO_TIMEOUT );\r
+    }\r
+  @endcode\r
+ */\r
+i2c_status_t I2C_wait_complete\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint32_t timeout_ms\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  Time out delay expiration.\r
+  ------------------------------------------------------------------------------\r
+  This function is used to control the expiration of the time out delay\r
+  specified as a parameter to the I2C_wait_complete() function. It must be\r
+  called from the interrupt service routine of a periodic interrupt source such\r
+  as the Cortex-M3 SysTick timer interrupt. It takes the period of the interrupt\r
+  source as its ms_since_last_tick parameter and uses it as the time base for\r
+  the I2C_wait_complete() function\92s time out delay.\r
+  \r
+  Note: This function does not need to be called if the I2C_wait_complete()\r
+        function is called with a timeout_ms value of I2C_NO_TIMEOUT.\r
+  Note: If this function is not called then the I2C_wait_complete() function\r
+        will behave as if its timeout_ms was specified as I2C_NO_TIMEOUT and it\r
+        will not time out.\r
+  Note: If this function is being called from an interrupt handler (e.g SysTick)\r
+        it is important that the calling interrupt have a lower priority than\r
+        the CoreI2C interrupt(s) to ensure any updates to shared data are\r
+        protected.\r
+  \r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+  @param ms_since_last_tick:\r
+    The ms_since_last_tick parameter specifies the number of milliseconds that\r
+    elapsed since the last call to I2C_system_tick(). This parameter would\r
+    typically be a constant specifying the interrupt rate of a timer used to\r
+    generate system ticks.\r
+  ------------------------------------------------------------------------------\r
+  @return\r
+    none.\r
+\r
+  Example:\r
+    The example below shows an example of how the I2C_system_tick() function\r
+    would be called in a Cortex-M3 based system. I2C_system_tick() is called for\r
+    each I2C channel from the Cortex-M3 SysTick timer interrupt service routine.\r
+    The SysTick is configured to generate an interrupt every 10 milliseconds in\r
+    the example below.\r
+  @code\r
+    #define SYSTICK_INTERVAL_MS 10\r
+   \r
+    void SysTick_Handler(void)\r
+    {\r
+        I2C_system_tick(&g_core_i2c0, SYSTICK_INTERVAL_MS);\r
+        I2C_system_tick(&g_core_i2c2, SYSTICK_INTERVAL_MS);\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_system_tick\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint32_t ms_since_last_tick\r
+);\r
+\r
+/*******************************************************************************\r
+ *******************************************************************************\r
+ * \r
+ *                           Slave specific functions\r
+ * \r
+ * The following functions are only used within the implementation of an I2C\r
+ * slave device.\r
+ */\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  I2C slave transmit buffer configuration.\r
+  ------------------------------------------------------------------------------\r
+  This function specifies the memory buffer holding the data that will be sent\r
+  to the I2C master when this CoreI2C channel is the target of an I2C read or\r
+  write-read transaction.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+  \r
+  @param tx_buffer:\r
+    This parameter is a pointer to the memory buffer holding the data to be\r
+    returned to the I2C master when this CoreI2C channel is the target of an\r
+    I2C read or write-read transaction.\r
+  \r
+  @param tx_size:\r
+    Size of the transmit buffer pointed to by the tx_buffer parameter.\r
+\r
+  @return none.  \r
+      \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR    0xC0000000u\r
+    #define SLAVE_SER_ADDR       0x10u\r
+    #define SLAVE_TX_BUFFER_SIZE 10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    uint8_t g_slave_tx_buffer[SLAVE_TX_BUFFER_SIZE] = { 1, 2, 3, 4, 5,\r
+                                                        6, 7, 8, 9, 10 };\r
+\r
+    void main( void )\r
+    {\r
+        // Initialize the CoreI2C driver with its base address, I2C serial\r
+        // address and serial clock divider.\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+       \r
+        // Specify the transmit buffer containing the data that will be\r
+        // returned to the master during read and write-read transactions.\r
+        I2C_set_slave_tx_buffer( &g_i2c_inst, g_slave_tx_buffer, \r
+                                 sizeof(g_slave_tx_buffer) );\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_set_slave_tx_buffer\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    const uint8_t * tx_buffer,\r
+    uint16_t tx_size\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  I2C slave receive buffer configuration.\r
+  ------------------------------------------------------------------------------\r
+  This function specifies the memory buffer that will be used by the CoreI2C\r
+  channel to receive data when it is a slave. This buffer is the memory where\r
+  data will be stored when the CoreI2C channel is the target of an I2C master\r
+  write transaction (i.e. when it is the slave).\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+  \r
+  @param rx_buffer:\r
+    This parameter is a pointer to the memory buffer allocated by the caller\r
+    software to be used as a slave receive buffer.\r
+  \r
+  @param rx_size:\r
+    Size of the slave receive buffer. This is the amount of memory that is\r
+    allocated to the buffer pointed to by rx_buffer.\r
+    Note:   This buffer size indirectly specifies the maximum I2C write\r
+            transaction length this CoreI2C channel can be the target of. This\r
+            is because this CoreI2C channel responds to further received\r
+            bytes with a non-acknowledge bit (NACK) as soon as its receive\r
+            buffer is full. This causes the write transaction to fail.\r
+            \r
+  @return none.  \r
+      \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR    0xC0000000u\r
+    #define SLAVE_SER_ADDR       0x10u\r
+    #define SLAVE_RX_BUFFER_SIZE 10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    uint8_t g_slave_rx_buffer[SLAVE_RX_BUFFER_SIZE];\r
+\r
+    void main( void )\r
+    {\r
+        // Initialize the CoreI2C driver with its base address, I2C serial\r
+        // address and serial clock divider.\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+       \r
+        // Specify the buffer used to store the data written by the I2C master.\r
+        I2C_set_slave_rx_buffer( &g_i2c_inst, g_slave_rx_buffer, \r
+                                 sizeof(g_slave_rx_buffer) );\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_set_slave_rx_buffer\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t * rx_buffer,\r
+    uint16_t rx_size\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  I2C slave memory offset length configuration.\r
+  ------------------------------------------------------------------------------\r
+  This function is used as part of the configuration of a CoreI2C channel for\r
+  operation as a slave supporting write-read transactions. It specifies the\r
+  number of bytes expected as part of the write phase of a write-read\r
+  transaction. The bytes received during the write phase of a write-read\r
+  transaction will be interpreted as an offset into the slave's transmit buffer.\r
+  This allows random access into the I2C slave transmit buffer from a remote\r
+  I2C master.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+  \r
+  @param offset_length:\r
+    The offset_length parameter configures the number of bytes to be interpreted\r
+    by the CoreI2C slave as a memory offset value during the write phase of\r
+    write-read transactions. The maximum value for the offset_length parameter\r
+    is two. The value of offset_length has the following effect on the \r
+    interpretation of the received data.\r
+    \r
+      If offset_length is 0, the offset into the transmit buffer is fixed at 0.\r
+      \r
+      If offset_length is 1, a single byte of received data is interpreted as an\r
+      unsigned 8 bit offset value in the range 0 to 255.\r
+      \r
+      If offset_length is 2, 2 bytes of received data are interpreted as an\r
+      unsigned 16 bit offset value in the range 0 to 65535. The first byte\r
+      received in this case provides the high order bits of the offset and\r
+      the second byte provides the low order bits.\r
+      \r
+    If the number of bytes received does not match the non 0 value of\r
+    offset_length the transmit buffer offset is set to 0.\r
+            \r
+  @return none.  \r
+      \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR    0xC0000000u\r
+    #define SLAVE_SER_ADDR       0x10u\r
+    #define SLAVE_TX_BUFFER_SIZE 10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    uint8_t g_slave_tx_buffer[SLAVE_TX_BUFFER_SIZE] = { 1, 2, 3, 4, 5,\r
+                                                        6, 7, 8, 9, 10 };\r
+\r
+    void main( void )\r
+    {\r
+        // Initialize the CoreI2C driver with its base address, I2C serial\r
+        // address and serial clock divider.\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+        I2C_set_slave_tx_buffer( &g_i2c_inst, g_slave_tx_buffer, \r
+                                 sizeof(g_slave_tx_buffer) );\r
+        I2C_set_slave_mem_offset_length( &g_i2c_inst, 1 );\r
+    }\r
+  @endcode        \r
+ */\r
+void I2C_set_slave_mem_offset_length\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t offset_length\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  I2C write handler registration. \r
+  ------------------------------------------------------------------------------\r
+  Register the function that is called to process the data written to this\r
+  CoreI2C channel when it is the slave in an I2C write transaction.\r
+  Note: If a write handler is registered, it is called on completion of the\r
+        write phase of a write-read transaction and responsible for processing\r
+        the received data in the slave receive buffer and populating the slave\r
+        transmit buffer with the data that will be transmitted to the I2C master\r
+        as part of the read phase of the write-read transaction. If a write\r
+        handler is not registered, the write data of a write read transaction is\r
+        interpreted as an offset into the slave\92s transmit buffer and handled by\r
+        the driver.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+  \r
+  @param handler:\r
+    Pointer to the function that will process the I2C write request.\r
+            \r
+  @return none.  \r
+      \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR    0xC0000000u\r
+    #define SLAVE_SER_ADDR       0x10u\r
+    #define SLAVE_TX_BUFFER_SIZE 10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    uint8_t g_slave_tx_buffer[SLAVE_TX_BUFFER_SIZE] = { 1, 2, 3, 4, 5,\r
+                                                       6, 7, 8, 9, 10 };\r
+\r
+    // local function prototype\r
+    void slave_write_handler\r
+    (\r
+        i2c_instance_t * this_i2c,\r
+        uint8_t * p_rx_data,\r
+        uint16_t rx_size\r
+    );\r
+\r
+    void main( void )\r
+    {\r
+        // Initialize the CoreI2C driver with its base address, I2C serial\r
+        // address and serial clock divider.\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
+                  I2C_PCLK_DIV_256 );\r
+        I2C_set_slave_tx_buffer( &g_i2c_inst, g_slave_tx_buffer, \r
+                                 sizeof(g_slave_tx_buffer) );\r
+        I2C_set_slave_mem_offset_length( &g_i2c_inst, 1 );\r
+        I2C_register_write_handler( &g_i2c_inst, slave_write_handler );\r
+    }\r
+  @endcode    \r
+*/\r
+void I2C_register_write_handler\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    i2c_slave_wr_handler_t handler\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  I2C slave enable.\r
+  ------------------------------------------------------------------------------\r
+  This function enables slave mode operation for a CoreI2C channel. It enables \r
+  the CoreI2C slave to receive data when it is the target of an I2C read, write\r
+  or write-read transaction.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return none.\r
+\r
+  Example:\r
+  @code\r
+    // Enable I2C slave\r
+    I2C_enable_slave( &g_i2c_inst );\r
+  @endcode\r
+ */\r
+void I2C_enable_slave\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  I2C slave disable.\r
+  ------------------------------------------------------------------------------\r
+  This function disables slave mode operation for a CoreI2C channel. It stops\r
+  the CoreI2C slave acknowledging I2C read, write or write-read transactions\r
+  targeted at it.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return none.\r
+\r
+  Example:\r
+  @code\r
+   // Disable I2C slave\r
+   I2C_disable_slave( &g_i2c_inst );\r
+  @endcode\r
+ */\r
+void I2C_disable_slave\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+/*-------------------------------------------------------------------------*//**\r
+  Set I2C slave second address.\r
+  ------------------------------------------------------------------------------\r
+  The function I2C_set_slave_second_addr() sets the secondary slave address for\r
+  a CoreI2C slave device. This is an additional slave address which might be\r
+  required in certain applications, for example to enable fail-safe operation in\r
+  a system. As the CoreI2C device supports 7-bit addressing, the highest value\r
+  which can be assigned to second slave address is 127 (0x7F).\r
+  Note: This function does not support CoreI2C hardware configured with a fixed \r
+      second slave address.  The current implementation of the ADDR1[0] register\r
+      bit makes it difficult for the driver to support both programmable and\r
+      fixed second slave address, so we choose to support programmable only.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @param second_slave_addr:\r
+    The second_slave_addr parameter is the secondary slave address of the I2C\r
+    device.\r
+\r
+  @return\r
+    none.\r
+\r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define SLAVE_SER_ADDR     0x10u\r
+    #define SECOND_SLAVE_ADDR  0x20u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+    void main( void )\r
+    {\r
+        // Initialize the CoreI2C driver with its base address, primary I2C\r
+        // serial address and serial clock divider.\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
+                  I2C_PCLK_DIV_256 );\r
+        I2C_set_slave_second_addr( &g_i2c_inst, SECOND_SLAVE_ADDR );\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_set_slave_second_addr\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t second_slave_addr\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  Disable second slave address.\r
+  ------------------------------------------------------------------------------\r
+  The function I2C_disable_slave_second_addr() disables the secondary slave\r
+  address of the CoreI2C slave device. \r
+  Note: This version of the driver only supports CoreI2C hardware configured\r
+        with a programmable second slave address.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return\r
+    none.\r
+\r
+  Example:\r
+  @code\r
+    i2c_instance_t g_i2c_inst;\r
+    I2C_disable_slave_second_addr( &g_i2c_inst);\r
+  @endcode\r
+ */\r
+void I2C_disable_slave_second_addr\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_set_gca() function is used to set the general call acknowledgement bit\r
+  of a CoreI2C slave device. This allows all channels of the CoreI2C slave\r
+  device respond to a general call or broadcast message from an I2C master.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return\r
+    none.\r
+\r
+  Example:\r
+  @code\r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    // Enable recognition of the General Call Address\r
+    I2C_set_gca( &g_i2c_inst ); \r
+  @endcode\r
+ */\r
+void I2C_set_gca\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_clear_gca() function is used to clear the general call acknowledgement\r
+  bit of a CoreI2C slave device. This will stop all channels of the I2C slave\r
+  device responding to any general call or broadcast message from the master.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return\r
+    none.\r
+\r
+  Example:\r
+  @code\r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    // Disable recognition of the General Call Address\r
+    I2C_clear_gca( &g_i2c_inst );\r
+  @endcode\r
+ */\r
+\r
+void I2C_clear_gca\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*------------------------------------------------------------------------------\r
+                      I2C SMBUS specific APIs\r
+ ----------------------------------------------------------------------------*/\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_smbus_init() function enables SMBus timeouts and status logic for a\r
+  CoreI2C channel.\r
+  Note: This and any of the other SMBus related functionality will only have an\r
+        effect if the CoreI2C was instantiated with the Generate SMBus Logic\r
+        option checked.\r
+  Note: If the CoreI2C was instantiated with the Generate IPMI Logic option\r
+        checked this function will enable the IPMI 3mS SCL low timeout but none\r
+        of the other SMBus functions will have any effect.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return\r
+    none.\r
+\r
+  Example:\r
+  @code\r
+   #define COREI2C_BASE_ADDR  0xC0000000u\r
+   #define SLAVE_SER_ADDR     0x10u\r
+\r
+   i2c_instance_t g_i2c_inst;\r
+\r
+   void system_init( void )\r
+   {\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+        \r
+        // Initialize SMBus feature\r
+        I2C_smbus_init( &g_i2c_inst);\r
+   }\r
+  @endcode    \r
+ */\r
+void I2C_smbus_init\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_enable_smbus_irq() function is used to enable the CoreI2C channel\92\r
+  SMBSUS and SMBALERT SMBus interrupts.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @param irq_type\r
+    The irq_type specify the SMBUS interrupt(s) which will be enabled.\r
+    The two possible interrupts are:\r
+      I2C_SMBALERT_IRQ\r
+      I2C_SMBSUS_IRQ\r
+    To enable both ints in one call, use I2C_SMBALERT_IRQ | I2C_SMBSUS_IRQ.\r
+    \r
+  @return\r
+    none\r
+  \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define SLAVE_SER_ADDR     0x10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    void main( void )\r
+    {\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+        \r
+        // Initialize SMBus feature\r
+        I2C_smbus_init( &g_i2c_inst );\r
+        \r
+        // Enable both I2C_SMBALERT_IRQ & I2C_SMBSUS_IRQ interrupts\r
+        I2C_enable_smbus_irq( &g_i2c_inst,\r
+                              (uint8_t)(I2C_SMBALERT_IRQ | I2C_SMBSUS_IRQ) );\r
+   }\r
+   @endcode\r
+ */\r
+void I2C_enable_smbus_irq\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t  irq_type\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_disable_smbus_irq() function is used to disable the CoreI2C channel\92s\r
+  SMBSUS and SMBALERT SMBus interrupts.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @param irq_type\r
+    The irq_type specifies the SMBUS interrupt(s) which will be disabled.\r
+    The two possible interrupts are:\r
+      I2C_SMBALERT_IRQ\r
+      I2C_SMBSUS_IRQ\r
+    To disable both ints in one call, use I2C_SMBALERT_IRQ | I2C_SMBSUS_IRQ.\r
+\r
+  @return\r
+    none.\r
+      \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define SLAVE_SER_ADDR     0x10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+\r
+    void main( void )\r
+    {\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+        \r
+        // Initialize SMBus feature\r
+        I2C_smbus_init( &g_i2c_inst );\r
+        \r
+        // Enable both SMBALERT & SMBSUS interrupts\r
+        I2C_enable_smbus_irq( &g_i2c_inst,\r
+                              (uint8_t)(I2C_SMBALERT_IRQ | I2C_SMBSUS_IRQ));\r
+        \r
+        ...        \r
+\r
+        // Disable the SMBALERT interrupt\r
+        I2C_disable_smbus_irq( &g_i2c_inst, I2C_SMBALERT_IRQ );\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_disable_smbus_irq\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    uint8_t  irq_type\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The function I2C_suspend_smbus_slave() forces any SMBUS slave devices\r
+  connected to a CoreI2C channel into power down or suspend mode by asserting\r
+  the channel's SMBSUS signal. The CoreI2C channel is the SMBus master in this\r
+  case.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return\r
+    none.\r
+    \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define SLAVE_SER_ADDR     0x10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+    \r
+    void main( void )\r
+    {\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
+                  I2C_PCLK_DIV_256 );\r
+\r
+        // Initialize SMBus feature\r
+        I2C_smbus_init( &g_i2c_inst );\r
+\r
+        // suspend SMBus slaves\r
+        I2C_suspend_smbus_slave( &g_i2c_inst );\r
+\r
+        ...\r
+\r
+        // Re-enable SMBus slaves\r
+        I2C_resume_smbus_slave( &g_i2c_inst );\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_suspend_smbus_slave\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The function I2C_resume_smbus_slave() de-asserts the CoreI2C channel's SMBSUS\r
+  signal to take any connected slave devices out of suspend mode. The CoreI2C\r
+  channel is the SMBus master in this case.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return\r
+    none.\r
+    \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define SLAVE_SER_ADDR     0x10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+    \r
+    void main( void )\r
+    {\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
+                  I2C_PCLK_DIV_256 );\r
+\r
+        // Initialize SMBus feature\r
+        I2C_smbus_init( &g_i2c_inst );\r
+\r
+        // suspend SMBus slaves\r
+        I2C_suspend_smbus_slave( &g_i2c_inst );\r
+\r
+        ...\r
+\r
+        // Re-enable SMBus slaves\r
+        I2C_resume_smbus_slave( &g_i2c_inst );\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_resume_smbus_slave\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_reset_smbus() function resets the CoreI2C channel's SMBus connection\r
+  by forcing SCLK low for 35mS. The reset is automatically cleared after 35ms\r
+  have elapsed. The CoreI2C channel is the SMBus master in this case.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return\r
+    none.\r
+\r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define SLAVE_SER_ADDR     0x10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+    \r
+    void main( void )\r
+    {\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
+                  I2C_PCLK_DIV_256 );\r
+\r
+        // Initialize SMBus feature\r
+        I2C_smbus_init( &g_i2c_inst );\r
+\r
+        // Make sure the SMBus channel is in a known state by resetting it\r
+        I2C_reset_smbus( &g_i2c_inst ); \r
+    }\r
+  @endcode\r
+ */\r
+void I2C_reset_smbus\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_set_smbus_alert() function is used to force master communication with\r
+  an I2C slave device by asserting the CoreI2C channel\92s SMBALERT signal. The\r
+  CoreI2C channel is the SMBus slave in this case.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return\r
+    none.\r
+\r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define SLAVE_SER_ADDR     0x10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+    \r
+    void main( void )\r
+    {\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
+                  I2C_PCLK_DIV_256 );\r
+\r
+        // Initialize SMBus feature\r
+        I2C_smbus_init( &g_i2c_inst );\r
+\r
+        // Get the SMBus masters attention\r
+        I2C_set_smbus_alert( &g_i2c_inst );\r
+\r
+        ...\r
+\r
+        // Once we are happy, drop the alert\r
+        I2C_clear_smbus_alert( &g_i2c_inst );\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_set_smbus_alert\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_clear_smbus_alert() function is used de-assert the CoreI2C channel\92\r
+  SMBALERT signal once a slave device has had a response from the master. The\r
+  CoreI2C channel is the SMBus slave in this case.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return\r
+    none.\r
+    \r
+  Example:\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define SLAVE_SER_ADDR     0x10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+    \r
+    void main( void )\r
+    {\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
+                  I2C_PCLK_DIV_256 );\r
+\r
+        // Initialize SMBus feature\r
+        I2C_smbus_init( &g_i2c_inst );\r
+\r
+        // Get the SMBus masters attention\r
+        I2C_set_smbus_alert( &g_i2c_inst );\r
+\r
+        ...\r
+\r
+        // Once we are happy, drop the alert\r
+        I2C_clear_smbus_alert( &g_i2c_inst );\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_clear_smbus_alert\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_get_irq_status function returns information on which interrupts are\r
+  currently pending in a CoreI2C channel.\r
+  The interrupts supported by CoreI2C are:\r
+    * SMBUSALERT\r
+    * SMBSUS\r
+    * INTR\r
+  The macros I2C_NO_IRQ, I2C_SMBALERT_IRQ, I2C_SMBSUS_IRQ and I2C_INTR_IRQ are\r
+  provided for use with this function.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return\r
+    This function returns the status of the CoreI2C channel\92s interrupts as a \r
+    single byte bitmap where a bit is set to indicate a pending interrupt.\r
+    The following are the bit positions associated with each interrupt type:\r
+        Bit 0 - SMBUS_ALERT_IRQ\r
+        Bit 1 - SMBSUS_IRQ\r
+        Bit 2 - INTR_IRQ\r
+    It returns 0, if there are no pending interrupts.\r
+\r
+  Example\r
+  @code\r
+   #define COREI2C_BASE_ADDR  0xC0000000u\r
+   #define SLAVE_SER_ADDR     0x10u\r
+\r
+   i2c_instance_t g_i2c_inst;\r
+   \r
+   void main( void )\r
+   {\r
+        uint8_t irq_to_enable = I2C_SMBALERT_IRQ | I2C_SMBSUS_IRQ;\r
+        uint8_t pending_irq = 0u;\r
+        \r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+\r
+        // Initialize SMBus feature\r
+        I2C_smbus_init( &g_i2c_inst );\r
+\r
+        // Enable both I2C_SMBALERT_IRQ & I2C_SMBSUS_IRQ irq\r
+        I2C_enable_smbus_irq( &g_i2c_inst, irq_to_enable );\r
+\r
+        // Get I2C IRQ type\r
+        pending_irq = I2C_get_irq_status( &g_i2c_inst );\r
+\r
+        // Let's assume, in system, INTR and SMBALERT IRQ is pending.\r
+        // So pending_irq will return status of both the IRQs\r
+\r
+        if( pending_irq & I2C_SMBALERT_IRQ )\r
+        {\r
+           // if true, it means SMBALERT_IRQ is there in pending IRQ list\r
+        }\r
+        if( pending_irq & I2C_INTR_IRQ )\r
+        {\r
+           // if true, it means I2C_INTR_IRQ is there in pending IRQ list\r
+        }\r
+   }\r
+  @endcode\r
+ */\r
+uint8_t I2C_get_irq_status\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_set_user_data() function is used to allow the association of a block\r
+  of application specific data with a CoreI2C channel. The composition of the \r
+  data block is an application matter and the driver simply provides the means\r
+  for the application to set and retrieve the pointer. This may for example be\r
+  used to provide additional channel specific information to the slave write \r
+  handler.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @param p_user_data:\r
+    The p_user_data parameter is a pointer to the user specific data block for\r
+    this channel. It is defined as void * as the driver does not know the actual\r
+    type of data being pointed to and simply stores the pointer for later\r
+    retrieval by the application.\r
+\r
+  @return\r
+    none.\r
+    \r
+  Example\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define SLAVE_SER_ADDR     0x10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+    app_data_t channel_xdata;\r
+  \r
+    void main( void )\r
+    {\r
+        app_data_t *p_xdata;\r
+\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR, \r
+                  I2C_PCLK_DIV_256 );\r
+\r
+        // Store location of user data in instance structure\r
+        I2C_set_user_data( &g_i2c_inst, (void *)&channel_xdata );\r
+\r
+        ...\r
+\r
+        // Retrieve location of user data and do some work on it\r
+        p_xdata = (app_data_t *)I2C_get_user_data( &g_i2c_inst );\r
+        if( NULL != p_xdata )\r
+        {\r
+            p_xdata->foo = 123;\r
+        }\r
+    }\r
+  @endcode\r
+ */\r
+void I2C_set_user_data\r
+(\r
+    i2c_instance_t * this_i2c,\r
+    void * p_user_data\r
+);\r
+\r
+/*-------------------------------------------------------------------------*//**\r
+  The I2C_get_user_data() function is used to allow the retrieval of the address\r
+  of a block of application specific data associated with a CoreI2C channel.\r
+  The composition of the data block is an application matter and the driver \r
+  simply provides the means for the application to set and retrieve the pointer.\r
+  This may for example be used to provide additional channel specific\r
+  information to the slave write handler.\r
+  ------------------------------------------------------------------------------\r
+  @param this_i2c:\r
+    The this_i2c parameter is a pointer to the i2c_instance_t data structure\r
+    holding all data related to a specific CoreI2C channel. For example, if only\r
+    one channel is initialized, this data structure holds the information of \r
+    channel 0 of the instantiated CoreI2C hardware.\r
+\r
+  @return\r
+    This function returns a pointer to the user specific data block for this \r
+    channel. It is defined as void * as the driver does not know the actual type\r
+    of data being pointed. If no user data has been registered for this channel\r
+    a NULL pointer is returned.\r
+    \r
+  Example\r
+  @code\r
+    #define COREI2C_BASE_ADDR  0xC0000000u\r
+    #define SLAVE_SER_ADDR     0x10u\r
+\r
+    i2c_instance_t g_i2c_inst;\r
+    app_data_t channel_xdata;\r
+  \r
+    void main( void )\r
+    {\r
+        app_data_t *p_xdata;\r
+\r
+        I2C_init( &g_i2c_inst, COREI2C_BASE_ADDR, SLAVE_SER_ADDR,\r
+                  I2C_PCLK_DIV_256 );\r
+\r
+        // Store location of user data in instance structure\r
+        I2C_set_user_data( &g_i2c_inst, (void *)&channel_xdata );\r
+\r
+        ...\r
+        \r
+        // Retrieve location of user data and do some work on it\r
+        p_xdata = (app_data_t *)I2C_get_user_data( &g_i2c_inst );\r
+        if( NULL != p_xdata )\r
+        {\r
+            p_xdata->foo = 123;\r
+        }\r
+    }\r
+  @endcode\r
+ */\r
+void * I2C_get_user_data\r
+(\r
+    i2c_instance_t * this_i2c\r
+);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_smbus_regs.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreI2C/core_smbus_regs.h
new file mode 100644 (file)
index 0000000..67da7a5
--- /dev/null
@@ -0,0 +1,190 @@
+/*******************************************************************************\r
+ * (c) Copyright 2009-2015 Microsemi SoC Products Group.  All rights reserved.\r
+ * \r
+ * SVN $Revision: 7984 $\r
+ * SVN $Date: 2015-10-12 12:07:40 +0530 (Mon, 12 Oct 2015) $\r
+ */\r
+\r
+#ifndef __CORE_SMBUS_REGISTERS\r
+#define __CORE_SMBUS_REGISTERS    1\r
+\r
+/*------------------------------------------------------------------------------\r
+ * CONTROL register details\r
+ */\r
+#define CONTROL_REG_OFFSET    0x00u\r
+\r
+/*\r
+ * CR0 bits.\r
+ */\r
+#define CR0_OFFSET   0x00u\r
+#define CR0_MASK     0x01u\r
+#define CR0_SHIFT    0u\r
+\r
+/*\r
+ * CR1 bits.\r
+ */\r
+#define CR1_OFFSET   0x00u\r
+#define CR1_MASK     0x02u\r
+#define CR1_SHIFT    1u\r
+\r
+/*\r
+ * AA bits.\r
+ */\r
+#define AA_OFFSET   0x00u\r
+#define AA_MASK     0x04u\r
+#define AA_SHIFT    2u\r
+\r
+/*\r
+ * SI bits.\r
+ */\r
+#define SI_OFFSET   0x00u\r
+#define SI_MASK     0x08u\r
+#define SI_SHIFT    3u\r
+\r
+/*\r
+ * STO bits.\r
+ */\r
+#define STO_OFFSET   0x00u\r
+#define STO_MASK     0x10u\r
+#define STO_SHIFT    4u\r
+\r
+/*\r
+ * STA bits.\r
+ */\r
+#define STA_OFFSET   0x00u\r
+#define STA_MASK     0x20u\r
+#define STA_SHIFT    5u\r
+\r
+/*\r
+ * ENS1 bits.\r
+ */\r
+#define ENS1_OFFSET   0x00u\r
+#define ENS1_MASK     0x40u\r
+#define ENS1_SHIFT    6u\r
+\r
+/*\r
+ * CR2 bits.\r
+ */\r
+#define CR2_OFFSET   0x00u\r
+#define CR2_MASK     0x80u\r
+#define CR2_SHIFT    7u\r
+\r
+/*------------------------------------------------------------------------------\r
+ * STATUS register details\r
+ */\r
+#define STATUS_REG_OFFSET    0x04u\r
+\r
+/*------------------------------------------------------------------------------\r
+ * DATA register details\r
+ */\r
+#define DATA_REG_OFFSET    0x08u\r
+\r
+/*\r
+ * TARGET_ADDR bits.\r
+ */\r
+#define TARGET_ADDR_OFFSET    0x08u\r
+#define TARGET_ADDR_MASK      0xFEu\r
+#define TARGET_ADDR_SHIFT     1u\r
\r
+/*\r
+ * DIR bit.\r
+ */\r
+#define DIR_OFFSET   0x08u\r
+#define DIR_MASK     0x01u\r
+#define DIR_SHIFT    0u\r
+\r
+\r
+/*------------------------------------------------------------------------------\r
+ * ADDRESS register details\r
+ */\r
+#define ADDRESS_REG_OFFSET    0x0Cu\r
+\r
+/*\r
+ * GC bits.\r
+ */\r
+#define GC_OFFSET   0x0Cu\r
+#define GC_MASK     0x01u\r
+#define GC_SHIFT    0u\r
+\r
+/*\r
+ * ADR bits.\r
+ */\r
+#define OWN_SLAVE_ADDR_OFFSET   0x0Cu\r
+#define OWN_SLAVE_ADDR_MASK     0xFEu\r
+#define OWN_SLAVE_ADDR_SHIFT    1u\r
+\r
+/*------------------------------------------------------------------------------\r
+ * SMBUS register details\r
+ */\r
+#define SMBUS_REG_OFFSET    0x10u\r
+\r
+/*\r
+ * SMBALERT_IE bits.\r
+ */\r
+#define SMBALERT_IE_OFFSET   0x10u\r
+#define SMBALERT_IE_MASK     0x01u\r
+#define SMBALERT_IE_SHIFT    0u\r
+\r
+/*\r
+ * SMBSUS_IE bits.\r
+ */\r
+#define SMBSUS_IE_OFFSET   0x10u\r
+#define SMBSUS_IE_MASK     0x02u\r
+#define SMBSUS_IE_SHIFT    1u\r
+\r
+/*\r
+ * SMB_IPMI_EN bits.\r
+ */\r
+#define SMB_IPMI_EN_OFFSET   0x10u\r
+#define SMB_IPMI_EN_MASK     0x04u\r
+#define SMB_IPMI_EN_SHIFT    2u\r
+\r
+/*\r
+ * SMBALERT_NI_STATUS bits.\r
+ */\r
+#define SMBALERT_NI_STATUS_OFFSET   0x10u\r
+#define SMBALERT_NI_STATUS_MASK     0x08u\r
+#define SMBALERT_NI_STATUS_SHIFT    3u\r
+\r
+/*\r
+ * SMBALERT_NO_CONTROL bits.\r
+ */\r
+#define SMBALERT_NO_CONTROL_OFFSET   0x10u\r
+#define SMBALERT_NO_CONTROL_MASK     0x10u\r
+#define SMBALERT_NO_CONTROL_SHIFT    4u\r
+\r
+/*\r
+ * SMBSUS_NI_STATUS bits.\r
+ */\r
+#define SMBSUS_NI_STATUS_OFFSET   0x10u\r
+#define SMBSUS_NI_STATUS_MASK     0x20u\r
+#define SMBSUS_NI_STATUS_SHIFT    5u\r
+\r
+/*\r
+ * SMBSUS_NO_CONTROL bits.\r
+ */\r
+#define SMBSUS_NO_CONTROL_OFFSET   0x10u\r
+#define SMBSUS_NO_CONTROL_MASK     0x40u\r
+#define SMBSUS_NO_CONTROL_SHIFT    6u\r
+\r
+/*\r
+ * SMBUS_MST_RESET bits.\r
+ */\r
+#define SMBUS_MST_RESET_OFFSET   0x10u\r
+#define SMBUS_MST_RESET_MASK     0x80u\r
+#define SMBUS_MST_RESET_SHIFT    7u\r
+\r
+/*------------------------------------------------------------------------------\r
+ * SLAVE ADDRESS 1 register details\r
+ */\r
+\r
+#define ADDRESS1_REG_OFFSET    0x1Cu\r
+\r
+/*\r
+ * SLAVE1_EN bit of Slave Address 1 .\r
+ */\r
+#define SLAVE1_EN_OFFSET      0x1Cu\r
+#define SLAVE1_EN_MASK        0x01u\r
+#define SLAVE1_EN_SHIFT          0u\r
+\r
+#endif    /* __CORE_SMBUS_REGISTERS */\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreI2C/i2c_interrupt.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreI2C/i2c_interrupt.c
new file mode 100644 (file)
index 0000000..f918b8c
--- /dev/null
@@ -0,0 +1,35 @@
+/*******************************************************************************\r
+ * (c) Copyright 2009-2015 Microsemi SoC Products Group.  All rights reserved.\r
+ * \r
+ * CoreI2C driver interrupt control.\r
+ * \r
+ * SVN $Revision: 7984 $\r
+ * SVN $Date: 2015-10-12 12:07:40 +0530 (Mon, 12 Oct 2015) $\r
+ */\r
+#include "hal.h"\r
+#include "hal_assert.h"\r
+#include "core_i2c.h"\r
+#include "riscv_hal.h"\r
+\r
+\r
+#define I2C_IRQn                                           External_29_IRQn\r
+\r
+/*------------------------------------------------------------------------------\r
+ * This function must be modified to enable interrupts generated from the\r
+ * CoreI2C instance identified as parameter.\r
+ */\r
+void I2C_enable_irq( i2c_instance_t * this_i2c )\r
+{\r
+       PLIC_EnableIRQ(I2C_IRQn);\r
+//    HAL_ASSERT(0)\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * This function must be modified to disable interrupts generated from the\r
+ * CoreI2C instance identified as parameter.\r
+ */\r
+void I2C_disable_irq( i2c_instance_t * this_i2c )\r
+{\r
+       PLIC_DisableIRQ(I2C_IRQn);\r
+//    HAL_ASSERT(0)\r
+}\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreTimer/core_timer.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreTimer/core_timer.c
new file mode 100644 (file)
index 0000000..3f6720b
--- /dev/null
@@ -0,0 +1,158 @@
+/*******************************************************************************\r
+ * (c) Copyright 2007-2015 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * CoreTimer driver implementation.\r
+ * \r
+ * SVN $Revision: 7967 $\r
+ * SVN $Date: 2015-10-09 18:48:26 +0530 (Fri, 09 Oct 2015) $\r
+ */\r
+\r
+#include "core_timer.h"\r
+#include "coretimer_regs.h"\r
+#include "hal.h"\r
+#include "hal_assert.h"\r
+\r
+#ifndef NDEBUG\r
+static timer_instance_t* NULL_timer_instance;\r
+#endif\r
+\r
+/***************************************************************************//**\r
+ * TMR_init()\r
+ * See "core_timer.h" for details of how to use this function.\r
+ */\r
+void \r
+TMR_init\r
+(\r
+       timer_instance_t * this_timer,\r
+       addr_t address,\r
+       uint8_t mode,\r
+       uint32_t prescale,\r
+       uint32_t load_value\r
+)\r
+{\r
+       HAL_ASSERT( this_timer != NULL_timer_instance )\r
+       HAL_ASSERT( prescale <= PRESCALER_DIV_1024 )\r
+       HAL_ASSERT( load_value != 0 )\r
+    \r
+    this_timer->base_address = address;\r
+\r
+    /* Disable interrupts. */\r
+    HAL_set_32bit_reg_field( address, InterruptEnable,0 );\r
+\r
+    /* Disable timer. */\r
+    HAL_set_32bit_reg_field( address, TimerEnable, 0 );\r
+\r
+    /* Clear pending interrupt. */\r
+    HAL_set_32bit_reg( address, TimerIntClr, 1 );\r
+\r
+    /* Configure prescaler and load value. */  \r
+    HAL_set_32bit_reg( address, TimerPrescale, prescale );\r
+    HAL_set_32bit_reg( address, TimerLoad, load_value );\r
+\r
+    /* Set the interrupt mode. */\r
+    if ( mode == TMR_CONTINUOUS_MODE )\r
+    {\r
+        HAL_set_32bit_reg_field( address, TimerMode, 0 );\r
+    }\r
+    else\r
+    {\r
+        /* TMR_ONE_SHOT_MODE */\r
+        HAL_set_32bit_reg_field( address, TimerMode, 1 );\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * TMR_start()\r
+ * See "core_timer.h" for details of how to use this function.\r
+ */\r
+void\r
+TMR_start\r
+(\r
+    timer_instance_t * this_timer\r
+)\r
+{\r
+       HAL_ASSERT( this_timer != NULL_timer_instance )\r
+    \r
+    HAL_set_32bit_reg_field( this_timer->base_address, TimerEnable, 1 );\r
+}\r
+\r
+/***************************************************************************//**\r
+ * TMR_stop()\r
+ * See "core_timer.h" for details of how to use this function.\r
+ */\r
+void\r
+TMR_stop\r
+(\r
+    timer_instance_t * this_timer\r
+)\r
+{\r
+       HAL_ASSERT( this_timer != NULL_timer_instance )\r
+    \r
+    HAL_set_32bit_reg_field( this_timer->base_address, TimerEnable, 0 );\r
+}\r
+\r
+\r
+/***************************************************************************//**\r
+ * TMR_enable_int()\r
+ * See "core_timer.h" for details of how to use this function.\r
+ */\r
+void\r
+TMR_enable_int\r
+(\r
+    timer_instance_t * this_timer\r
+)\r
+{\r
+       HAL_ASSERT( this_timer != NULL_timer_instance )\r
+    \r
+    HAL_set_32bit_reg_field( this_timer->base_address, InterruptEnable, 1 );\r
+}\r
+\r
+/***************************************************************************//**\r
+ * TMR_clear_int()\r
+ * See "core_timer.h" for details of how to use this function.\r
+ */\r
+void\r
+TMR_clear_int\r
+(\r
+    timer_instance_t * this_timer\r
+)\r
+{\r
+       HAL_ASSERT( this_timer != NULL_timer_instance )\r
+    \r
+    HAL_set_32bit_reg( this_timer->base_address, TimerIntClr, 0x01 );\r
+}\r
+\r
+/***************************************************************************//**\r
+ * TMR_current_value()\r
+ * See "core_timer.h" for details of how to use this function.\r
+ */\r
+uint32_t\r
+TMR_current_value\r
+(\r
+    timer_instance_t * this_timer\r
+)\r
+{\r
+       uint32_t value = 0;\r
+       HAL_ASSERT( this_timer != NULL_timer_instance )\r
+    \r
+    value = HAL_get_32bit_reg( this_timer->base_address, TimerValue );\r
+    \r
+       return value;\r
+}\r
+\r
+/***************************************************************************//**\r
+ * TMR_reload()\r
+ * See "core_timer.h" for details of how to use this function.\r
+ */\r
+void TMR_reload\r
+(\r
+       timer_instance_t * this_timer,\r
+       uint32_t load_value\r
+)\r
+{\r
+       HAL_ASSERT( this_timer != NULL_timer_instance )\r
+       HAL_ASSERT( load_value != 0 )\r
+       \r
+       HAL_set_32bit_reg(this_timer->base_address, TimerLoad, load_value );\r
+}\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreTimer/core_timer.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreTimer/core_timer.h
new file mode 100644 (file)
index 0000000..04b7a6e
--- /dev/null
@@ -0,0 +1,206 @@
+/*******************************************************************************\r
+ * (c) Copyright 2007-2015 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * CoreTimer public API.\r
+ * \r
+ * SVN $Revision: 7967 $\r
+ * SVN $Date: 2015-10-09 18:48:26 +0530 (Fri, 09 Oct 2015) $\r
+ */\r
+#ifndef CORE_TIMER_H_\r
+#define CORE_TIMER_H_\r
+\r
+#include "cpu_types.h"\r
+\r
+/***************************************************************************//**\r
+ * The following definitions are used to select the CoreTimer driver operating\r
+ * mode. They allow selecting continuous or one-shot mode.\r
+ * 1. Continuous Mode\r
+ * In continuous mode the timer's counter is decremented from the load value \r
+ * until it reaches zero. The timer counter is automatically reloaded, with the\r
+ * load value, upon reaching zero. An interrupt is generated every time the\r
+ * counter reaches zero if interrupt is enabled.\r
+ * This mode is typically used to generate an interrupt at constant time\r
+ * intervals.\r
+ * 2. One-shot mode: \r
+ * In one-shot mode, the counter decrements from the load value and until it\r
+ * reaches zero. An interrupt can be generated, if enabled, when the counter\r
+ * reaches zero. The timer's counter must be reloaded to begin counting down\r
+ * again.\r
+ */\r
+#define TMR_CONTINUOUS_MODE            0\r
+#define TMR_ONE_SHOT_MODE              1\r
+\r
+/***************************************************************************//**\r
+ * The following definitions are used to configure the CoreTimer prescaler.\r
+ * The prescaler is used to divide down the clock used to decrement the\r
+ * CoreTimer counter. It can be configure to divide the clock by 2, 4, 8,\r
+ * 16, 32, 64, 128, 256, 512, or 1024.\r
+ */\r
+#define PRESCALER_DIV_2                        0\r
+#define PRESCALER_DIV_4                        1\r
+#define PRESCALER_DIV_8                        2\r
+#define PRESCALER_DIV_16               3\r
+#define PRESCALER_DIV_32               4\r
+#define PRESCALER_DIV_64               5\r
+#define PRESCALER_DIV_128              6\r
+#define PRESCALER_DIV_256              7\r
+#define PRESCALER_DIV_512              8\r
+#define PRESCALER_DIV_1024             9\r
+\r
+/***************************************************************************//**\r
+ * There should be one instance of this structure for each instance of CoreTimer\r
+ * in your system. The function TMR_init() initializes this structure. It is\r
+ * used to identify the various CoreTimer hardware instances in your system.\r
+ * An initialized timer instance structure should be passed as first parameter to\r
+ * CoreTimer driver functions to identify which CoreTimer instance should perform\r
+ * the requested operation.\r
+ * Software using this driver should only need to create one single instance of \r
+ * this data structure for each hardware timer instance in the system.\r
+ */\r
+typedef struct __timer_instance_t\r
+{\r
+       addr_t base_address;\r
+} timer_instance_t;\r
+\r
+/***************************************************************************//**\r
+ * The function TMR_init() initializes the data structures and sets relevant\r
+ * CoreTimer registers. This function will prepare the Timer for use in a given\r
+ * hardware/software configuration. It should be called before any other Timer\r
+ * API functions.\r
+ * The timer will not start counting down immediately after this function is\r
+ * called. It is necessary to call TMR_start() to start the timer decrementing.\r
+ * The CoreTimer interrupt is disabled as part of this function.\r
+ *\r
+ * @param this_timer    Pointer to a timer_instance_t structure holding all \r
+ *                      relevant data associated with the target timer hardware\r
+ *                                             instance. This pointer will be used to identify the\r
+ *                                             target CoreTimer hardware instance in subsequent calls\r
+ *                                             to the CoreTimer functions.\r
+ * @param address       Base address in the processor's memory map of the \r
+ *                      registers of the CoreTimer instance being initialized.\r
+ * @param mode          This parameter is used to select the operating mode of\r
+ *                                             the timer driver. This can be either TMR_CONTINUOUS_MODE\r
+ *                                             or TMR_ONE_SHOT_MODE.\r
+ * @param prescale     This parameter is used to select the prescaler divider\r
+ *                                             used to divide down the clock used to decrement the\r
+ *                                             timer\92s counter. This can be set using one of the \r
+ *                                             PRESCALER_DIV_<n> definitions, where <n> is the\r
+ *                                             divider\92s value.  \r
+ * @param load_value   This parameter is used to set the timer\92s load value\r
+ *                                             from which the CoreTimer counter will decrement.\r
+ *                                             In Continuous mode, this value will be used to reload \r
+ *                                             the timer\92s counter whenever it reaches zero.\r
+ */\r
+void\r
+TMR_init\r
+(\r
+       timer_instance_t * this_timer,\r
+       addr_t address,\r
+       uint8_t mode,\r
+       uint32_t prescale,\r
+       uint32_t load_value\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The function TMR_start() enables the timer to start counting down.\r
+ * This function only needs to be called once after the timer has been\r
+ * initialized through a call to TMR_init(). It does not need to be called after\r
+ * each call to TMR_reload() when the timer is used in one-shot mode.\r
+ *\r
+ * @param this_timer    Pointer to a timer_instance_t structure holding all \r
+ *                      relevant data associated with the target timer hardware\r
+ *                                             instance. This pointer is used to identify the target\r
+ *                                             CoreTimer hardware instance.\r
+ */\r
+void\r
+TMR_start\r
+(\r
+    timer_instance_t * this_timer\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The function TMR_stop() stops the timer counting down. It can be used to \r
+ * stop interrupts from being generated when continuous mode is used and\r
+ * interrupts must be paused from being generated.\r
+ *\r
+ * @param this_timer    Pointer to a timer_instance_t structure holding all \r
+ *                      relevant data associated with the target timer hardware\r
+ *                                             instance. This pointer is used to identify the target\r
+ *                                             CoreTimer hardware instance.\r
+ */\r
+void\r
+TMR_stop\r
+(\r
+    timer_instance_t * this_timer\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The function TMR_enable_int() enables the timer interrupt. A call to this\r
+ * function will allow the interrupt signal coming out of CoreTimer to be\r
+ * asserted. \r
+ *\r
+ * @param this_timer    Pointer to a timer_instance_t structure holding all \r
+ *                      relevant data associated with the target timer hardware\r
+ *                                             instance. This pointer is used to identify the target\r
+ *                                             CoreTimer hardware instance.\r
+ */\r
+void\r
+TMR_enable_int\r
+(\r
+    timer_instance_t * this_timer\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The function TMR_clear_int() clears the timer interrupt. This function should\r
+ * be called within the interrupt handler servicing interrupts from the timer.\r
+ * Failure to clear the timer interrupt will result in the interrupt signal\r
+ * generating from CoreTimer to remain asserted. This assertion may cause the\r
+ * interrupt service routine to be continuously called, causing the system to\r
+ * lock up.\r
+ *\r
+ * @param this_timer    Pointer to a timer_instance_t structure holding all \r
+ *                      relevant data associated with the target timer hardware\r
+ *                                             instance. This pointer is used to identify the target\r
+ *                                             CoreTimer hardware instance.\r
+ */\r
+void\r
+TMR_clear_int\r
+(\r
+    timer_instance_t * this_timer\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The TMR_current_value() function returns the current value of the counter.\r
+ *\r
+ * @param this_timer    Pointer to a timer_instance_t structure holding all \r
+ *                      relevant data associated with the target timer hardware\r
+ *                                             instance. This pointer is used to identify the target\r
+ *                                             CoreTimer hardware instance.\r
+ *\r
+ * @return              Returns the current value of the timer counter value.\r
+ */\r
+uint32_t\r
+TMR_current_value\r
+(\r
+    timer_instance_t * this_timer\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The TMR_reload() function is used in one-shot mode. It reloads the timer\r
+ * counter with the values passed as parameter. This will result in an interrupt\r
+ * being generated when the timer counter reaches 0 if interrupt is enabled.\r
+ * \r
+ * @param this_timer    Pointer to a timer_instance_t structure holding all \r
+ *                      relevant data associated with the target timer hardware\r
+ *                                             instance. This pointer is used to identify the target\r
+ *                                             CoreTimer hardware instance.\r
+ * @param load_value   This parameter sets the value from which the CoreTimer\r
+ *                                             counter will decrement. \r
+ */\r
+void TMR_reload\r
+(\r
+       timer_instance_t * this_timer,\r
+       uint32_t load_value\r
+);\r
+       \r
+#endif /* CORE_TIMER_H_ */\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreTimer/coretimer_regs.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreTimer/coretimer_regs.h
new file mode 100644 (file)
index 0000000..5d7c67d
--- /dev/null
@@ -0,0 +1,109 @@
+/*******************************************************************************\r
+ * (c) Copyright 2007-2015 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * SVN $Revision: 7967 $\r
+ * SVN $Date: 2015-10-09 18:48:26 +0530 (Fri, 09 Oct 2015) $\r
+ */\r
+\r
+#ifndef __CORE_TIMER_REGISTERS\r
+#define __CORE_TIMER_REGISTERS 1\r
+\r
+/*------------------------------------------------------------------------------\r
+ * TimerLoad register details\r
+ */\r
+#define TimerLoad_REG_OFFSET   0x00\r
+\r
+/*\r
+ * LoadValue bits.\r
+ */\r
+#define LoadValue_OFFSET   0x00\r
+#define LoadValue_MASK     0xFFFFFFFF\r
+#define LoadValue_SHIFT    0\r
+\r
+/*------------------------------------------------------------------------------\r
+ * TimerValue register details\r
+ */\r
+#define TimerValue_REG_OFFSET  0x04\r
+\r
+/*\r
+ * CurrentValue bits.\r
+ */\r
+#define CurrentValue_OFFSET   0x04\r
+#define CurrentValue_MASK     0xFFFFFFFF\r
+#define CurrentValue_SHIFT    0\r
+\r
+/*------------------------------------------------------------------------------\r
+ * TimerControl register details\r
+ */\r
+#define TimerControl_REG_OFFSET        0x08\r
+\r
+/*\r
+ * TimerEnable bits.\r
+ */\r
+#define TimerEnable_OFFSET   0x08\r
+#define TimerEnable_MASK     0x00000001\r
+#define TimerEnable_SHIFT    0\r
+\r
+/*\r
+ * InterruptEnable bits.\r
+ */\r
+#define InterruptEnable_OFFSET   0x08\r
+#define InterruptEnable_MASK     0x00000002\r
+#define InterruptEnable_SHIFT    1\r
+\r
+/*\r
+ * TimerMode bits.\r
+ */\r
+#define TimerMode_OFFSET   0x08\r
+#define TimerMode_MASK     0x00000004\r
+#define TimerMode_SHIFT    2\r
+\r
+/*------------------------------------------------------------------------------\r
+ * TimerPrescale register details\r
+ */\r
+#define TimerPrescale_REG_OFFSET       0x0C\r
+\r
+/*\r
+ * Prescale bits.\r
+ */\r
+#define Prescale_OFFSET   0x0C\r
+#define Prescale_MASK     0x0000000F\r
+#define Prescale_SHIFT    0\r
+\r
+/*------------------------------------------------------------------------------\r
+ * TimerIntClr register details\r
+ */\r
+#define TimerIntClr_REG_OFFSET 0x10\r
+\r
+/*\r
+ * TimerIntClr bits.\r
+ */\r
+#define TimerIntClr_OFFSET   0x10\r
+#define TimerIntClr_MASK     0xFFFFFFFF\r
+#define TimerIntClr_SHIFT    0\r
+\r
+/*------------------------------------------------------------------------------\r
+ * TimerRIS register details\r
+ */\r
+#define TimerRIS_REG_OFFSET    0x14\r
+\r
+/*\r
+ * RawTimerInterrupt bits.\r
+ */\r
+#define RawTimerInterrupt_OFFSET   0x14\r
+#define RawTimerInterrupt_MASK     0x00000001\r
+#define RawTimerInterrupt_SHIFT    0\r
+\r
+/*------------------------------------------------------------------------------\r
+ * TimerMIS register details\r
+ */\r
+#define TimerMIS_REG_OFFSET    0x18\r
+\r
+/*\r
+ * TimerInterrupt bits.\r
+ */\r
+#define TimerInterrupt_OFFSET   0x18\r
+#define TimerInterrupt_MASK     0x00000001\r
+#define TimerInterrupt_SHIFT    0\r
+\r
+#endif /* __CORE_TIMER_REGISTERS */\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/core_uart_apb.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/core_uart_apb.c
new file mode 100644 (file)
index 0000000..b4f40dc
--- /dev/null
@@ -0,0 +1,296 @@
+/*******************************************************************************\r
+ * (c) Copyright 2007-2017 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * CoreUARTapb driver implementation. See file "core_uart_apb.h" for a\r
+ * description of the functions implemented in this file.\r
+ * \r
+ * SVN $Revision: 9082 $\r
+ * SVN $Date: 2017-04-28 11:51:36 +0530 (Fri, 28 Apr 2017) $\r
+ */\r
+#include "hal.h"\r
+#include "coreuartapb_regs.h"\r
+#include "core_uart_apb.h"\r
+#include "hal_assert.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#define NULL_INSTANCE ( ( UART_instance_t* ) 0 )\r
+#define NULL_BUFFER   ( ( uint8_t* ) 0 )\r
+\r
+#define MAX_LINE_CONFIG     ( ( uint8_t )( DATA_8_BITS | ODD_PARITY ) )\r
+#define MAX_BAUD_VALUE      ( ( uint16_t )( 0x1FFF ) )\r
+#define STATUS_ERROR_MASK   ( ( uint8_t )( STATUS_PARITYERR_MASK | \\r
+                                           STATUS_OVERFLOW_MASK  | \\r
+                                           STATUS_FRAMERR_MASK ) )\r
+#define BAUDVALUE_LSB ( (uint16_t) (0x00FF) )\r
+#define BAUDVALUE_MSB ( (uint16_t) (0xFF00) )\r
+#define BAUDVALUE_SHIFT ( (uint8_t) (5) )\r
+\r
+#define STATUS_ERROR_OFFSET STATUS_PARITYERR_SHIFT \r
+\r
+/***************************************************************************//**\r
+ * UART_init()\r
+ * See "core_uart_apb.h" for details of how to use this function.\r
+ */\r
+void\r
+UART_init\r
+(\r
+    UART_instance_t * this_uart,\r
+    addr_t base_addr,\r
+    uint16_t baud_value,\r
+    uint8_t line_config\r
+)\r
+{\r
+    uint8_t rx_full;\r
+    \r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    HAL_ASSERT( line_config <= MAX_LINE_CONFIG )\r
+    HAL_ASSERT( baud_value <= MAX_BAUD_VALUE )\r
+\r
+    if( ( this_uart != NULL_INSTANCE ) &&\r
+        ( line_config <= MAX_LINE_CONFIG ) &&\r
+        ( baud_value <= MAX_BAUD_VALUE ) )\r
+    {\r
+        /*\r
+         * Store lower 8-bits of baud value in CTRL1.\r
+         */\r
+        HAL_set_8bit_reg( base_addr, CTRL1, (uint_fast8_t)(baud_value &\r
+                                                       BAUDVALUE_LSB ) );\r
+    \r
+        /*\r
+         * Extract higher 5-bits of baud value and store in higher 5-bits \r
+         * of CTRL2, along with line configuration in lower 3 three bits.\r
+         */\r
+        HAL_set_8bit_reg( base_addr, CTRL2, (uint_fast8_t)line_config | \r
+                                           (uint_fast8_t)((baud_value &\r
+                                   BAUDVALUE_MSB) >> BAUDVALUE_SHIFT ) );\r
+    \r
+        this_uart->base_address = base_addr;\r
+#ifndef NDEBUG\r
+        {\r
+            uint8_t  config;\r
+            uint8_t  temp;\r
+            uint16_t baud_val;\r
+            baud_val = HAL_get_8bit_reg( this_uart->base_address, CTRL1 );\r
+            config =  HAL_get_8bit_reg( this_uart->base_address, CTRL2 );\r
+            /*\r
+             * To resolve operator precedence between & and <<\r
+             */\r
+            temp =  ( config  &  (uint8_t)(CTRL2_BAUDVALUE_MASK ) );\r
+            baud_val |= (uint16_t)( (uint16_t)(temp) << BAUDVALUE_SHIFT );\r
+            config &= (uint8_t)(~CTRL2_BAUDVALUE_MASK);\r
+            HAL_ASSERT( baud_val == baud_value );\r
+            HAL_ASSERT( config == line_config );\r
+        }        \r
+#endif\r
+        \r
+        /*\r
+         * Flush the receive FIFO of data that may have been received before the\r
+         * driver was initialized.\r
+         */\r
+        rx_full = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &\r
+                                                    STATUS_RXFULL_MASK;\r
+        while ( rx_full )\r
+        {\r
+            HAL_get_8bit_reg( this_uart->base_address, RXDATA );\r
+            rx_full = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &\r
+                                                        STATUS_RXFULL_MASK;\r
+        }\r
+\r
+        /*\r
+         * Clear status of the UART instance.\r
+         */\r
+        this_uart->status = (uint8_t)0;\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_send()\r
+ * See "core_uart_apb.h" for details of how to use this function.\r
+ */\r
+void\r
+UART_send\r
+(\r
+    UART_instance_t * this_uart,\r
+    const uint8_t * tx_buffer,\r
+    size_t tx_size\r
+)\r
+{\r
+    size_t char_idx;\r
+    uint8_t tx_ready;\r
+\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    HAL_ASSERT( tx_buffer != NULL_BUFFER )\r
+    HAL_ASSERT( tx_size > 0 )\r
+      \r
+    if( (this_uart != NULL_INSTANCE) &&\r
+        (tx_buffer != NULL_BUFFER)   &&\r
+        (tx_size > (size_t)0) )\r
+    {\r
+        for ( char_idx = (size_t)0; char_idx < tx_size; char_idx++ )\r
+        {\r
+            /* Wait for UART to become ready to transmit. */\r
+            do {\r
+                tx_ready = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &\r
+                                                              STATUS_TXRDY_MASK;\r
+            } while ( !tx_ready );\r
+            /* Send next character in the buffer. */\r
+            HAL_set_8bit_reg( this_uart->base_address, TXDATA,\r
+                              (uint_fast8_t)tx_buffer[char_idx] );\r
+        }\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_fill_tx_fifo()\r
+ * See "core_uart_apb.h" for details of how to use this function.\r
+ */\r
+size_t\r
+UART_fill_tx_fifo\r
+(\r
+    UART_instance_t * this_uart,\r
+    const uint8_t * tx_buffer,\r
+    size_t tx_size\r
+)\r
+{\r
+    uint8_t tx_ready;\r
+    size_t size_sent = 0u;\r
+    \r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    HAL_ASSERT( tx_buffer != NULL_BUFFER )\r
+    HAL_ASSERT( tx_size > 0 )\r
+      \r
+    /* Fill the UART's Tx FIFO until the FIFO is full or the complete input \r
+     * buffer has been written. */\r
+    if( (this_uart != NULL_INSTANCE) &&\r
+        (tx_buffer != NULL_BUFFER)   &&\r
+        (tx_size > 0u) )\r
+    {\r
+        tx_ready = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &\r
+                                                      STATUS_TXRDY_MASK;\r
+        if ( tx_ready )\r
+        {\r
+            do {\r
+                HAL_set_8bit_reg( this_uart->base_address, TXDATA,\r
+                                  (uint_fast8_t)tx_buffer[size_sent] );\r
+                size_sent++;\r
+                tx_ready = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &\r
+                                                              STATUS_TXRDY_MASK;\r
+            } while ( (tx_ready) && ( size_sent < tx_size ) );\r
+        }\r
+    }    \r
+    return size_sent;\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_get_rx()\r
+ * See "core_uart_apb.h" for details of how to use this function.\r
+ */\r
+size_t\r
+UART_get_rx\r
+(\r
+    UART_instance_t * this_uart,\r
+    uint8_t * rx_buffer,\r
+    size_t buff_size\r
+)\r
+{\r
+    uint8_t new_status;\r
+    uint8_t rx_full;\r
+    size_t rx_idx = 0u;\r
+    \r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    HAL_ASSERT( rx_buffer != NULL_BUFFER )\r
+    HAL_ASSERT( buff_size > 0 )\r
+      \r
+    if( (this_uart != NULL_INSTANCE) &&\r
+        (rx_buffer != NULL_BUFFER)   &&\r
+        (buff_size > 0u) )\r
+    {\r
+        rx_idx = 0u;\r
+        new_status = HAL_get_8bit_reg( this_uart->base_address, STATUS );\r
+        this_uart->status |= new_status;\r
+        rx_full = new_status & STATUS_RXFULL_MASK;\r
+        while ( ( rx_full ) && ( rx_idx < buff_size ) )\r
+        {\r
+            rx_buffer[rx_idx] = HAL_get_8bit_reg( this_uart->base_address,\r
+                                                  RXDATA );\r
+            rx_idx++;\r
+            new_status = HAL_get_8bit_reg( this_uart->base_address, STATUS );\r
+            this_uart->status |= new_status;\r
+            rx_full = new_status & STATUS_RXFULL_MASK;\r
+        }\r
+    }\r
+    return rx_idx;\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_polled_tx_string()\r
+ * See "core_uart_apb.h" for details of how to use this function.\r
+ */\r
+void \r
+UART_polled_tx_string\r
+( \r
+    UART_instance_t * this_uart, \r
+    const uint8_t * p_sz_string\r
+)\r
+{\r
+    uint32_t char_idx;\r
+    uint8_t tx_ready;\r
+\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    HAL_ASSERT( p_sz_string != NULL_BUFFER )\r
+    \r
+    if( ( this_uart != NULL_INSTANCE ) && ( p_sz_string != NULL_BUFFER ) )\r
+    {\r
+        char_idx = 0U;\r
+        while( 0U != p_sz_string[char_idx] )\r
+        {\r
+            /* Wait for UART to become ready to transmit. */\r
+            do {\r
+                tx_ready = HAL_get_8bit_reg( this_uart->base_address, STATUS ) &\r
+                                                              STATUS_TXRDY_MASK;\r
+            } while ( !tx_ready );\r
+            /* Send next character in the buffer. */\r
+            HAL_set_8bit_reg( this_uart->base_address, TXDATA,\r
+                              (uint_fast8_t)p_sz_string[char_idx] );\r
+            char_idx++;\r
+        }\r
+    }\r
+}\r
+\r
+/***************************************************************************//**\r
+ * UART_get_rx_status()\r
+ * See "core_uart_apb.h" for details of how to use this function.\r
+ */\r
+uint8_t\r
+UART_get_rx_status\r
+(\r
+    UART_instance_t * this_uart\r
+)\r
+{\r
+    uint8_t status = UART_APB_INVALID_PARAM;\r
+\r
+    HAL_ASSERT( this_uart != NULL_INSTANCE )\r
+    /*\r
+     * Extract UART error status and place in lower bits of "status".\r
+     * Bit 0 - Parity error status\r
+     * Bit 1 - Overflow error status\r
+     * Bit 2 - Frame error status\r
+     */\r
+    if( this_uart != NULL_INSTANCE )\r
+    {\r
+        status = ( ( this_uart->status & STATUS_ERROR_MASK ) >> \r
+                                          STATUS_ERROR_OFFSET );\r
+        /*\r
+         * Clear the sticky status for this instance.\r
+         */\r
+        this_uart->status = (uint8_t)0;\r
+    }\r
+    return status;\r
+}\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/core_uart_apb.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/core_uart_apb.h
new file mode 100644 (file)
index 0000000..680b68d
--- /dev/null
@@ -0,0 +1,407 @@
+/*******************************************************************************\r
+ * (c) Copyright 2007-2017 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * This file contains the application programming interface for the CoreUARTapb\r
+ * bare metal driver.\r
+ * \r
+ * SVN $Revision: 9082 $\r
+ * SVN $Date: 2017-04-28 11:51:36 +0530 (Fri, 28 Apr 2017) $\r
+ */\r
+/*=========================================================================*//**\r
+  @mainpage CoreUARTapb Bare Metal Driver.\r
+\r
+  @section intro_sec Introduction\r
+  CoreUARTapb is an implementation of the Universal Asynchronous \r
+  Receiver/Transmitter aimed at a minimal FPGA tile usage within an Microsemi\r
+  FPGA. The CoreUARTapb bare metal software driver is designed for use in \r
+  systems with no operating system.\r
+\r
+  The CoreUARTapb driver provides functions for basic polled transmitting and \r
+  receiving operations. It also provides functions allowing use of the \r
+  CoreUARTapb in interrupt-driven mode, but leaves the management of interrupts \r
+  to the calling application, as interrupt enabling and disabling cannot be \r
+  controlled through the CoreUARTapb registers. The CoreUARTapb driver is \r
+  provided as C source code.\r
+\r
+  @section driver_configuration Driver Configuration\r
+  Your application software should configure the CoreUARTapb driver, through \r
+  calls to the UART_init() function for each CoreUARTapb instance in the \r
+  hardware design. The configuration parameters include the CoreUARTapb \r
+  hardware instance base address and other runtime parameters, such as baud \r
+  rate, bit width, and parity. No CoreUARTapb hardware configuration parameters \r
+  are needed by the driver, apart from the CoreUARTapb hardware instance base \r
+  address. Hence, no additional configuration files are required to use the driver.\r
+\r
+  A CoreUARTapb hardware instance can be generated with fixed baud value, \r
+  character size and parity configuration settings as part of the hardware flow. \r
+  The baud_value and line_config parameter values passed to the UART_init() \r
+  function will not have any effect if fixed values were selected for the \r
+  baud value, character size and parity in the hardware configuration of \r
+  CoreUARTapb. When fixed values are selected for these hardware configuration \r
+  parameters, the driver cannot overwrite the fixed values in the CoreUARTapb \r
+  control registers, CTRL1 and CTRL2.\r
+\r
+  @section theory_op Theory of Operation\r
+  The CoreUARTapb software driver is designed to allow the control of multiple \r
+  instances of CoreUARTapb. Each instance of CoreUARTapb in the hardware design \r
+  is associated with a single instance of the UART_instance_t structure in the \r
+  software. You need to allocate memory for one unique UART_instance_t  \r
+  structure instance for each CoreUARTapb hardware instance. The contents of \r
+  these data structures are initialized during calls to function UART_init(). \r
+  A pointer to the structure is passed to subsequent driver functions in order\r
+  to identify the CoreUARTapb hardware instance you wish to perform the \r
+  requested operation on.\r
+  \r
+  Note: Do not attempt to directly manipulate the content of UART_instance_t \r
+  structures. This structure is only intended to be modified by the driver \r
+  function.\r
+\r
+  The driver can be used to transmit and receive data once initialized. \r
+  Transmit can be performed using the UART_send() function. This function\r
+  is blocking, meaning that it will only return once the data passed to \r
+  the function has been sent to the CoreUARTapb hardware. Data received \r
+  by the CoreUARTapb hardware can be read by the user application using \r
+  the UART_get_rx() function.\r
+\r
+  The function UART_fill_tx_fifo() is also provided to be used as part of \r
+  interrupt-driven transmit. This function fills the CoreUARTapb hardware \r
+  transmit FIFO with the content of a data buffer passed as a parameter before \r
+  returning. The control of the interrupts must be implemented outside the \r
+  driver as the CoreUARTapb hardware does not provide the ability to enable \r
+  or disable its interrupt sources.\r
+\r
+  The function UART_polled_tx_string() is provided to transmit a NULL \r
+  terminated string in polled mode. This function is blocking, meaning that it \r
+  will only return once the data passed to the function has been sent to the \r
+  CoreUARTapb hardware.\r
+\r
+  The function UART_get_rx_status() returns the error status of the CoreUARTapb\r
+  receiver. This can be used by applications to take appropriate action in case\r
+  of receiver errors.\r
+*//*=========================================================================*/\r
+#ifndef __CORE_UART_APB_H\r
+#define __CORE_UART_APB_H 1\r
+\r
+#include "cpu_types.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/***************************************************************************//**\r
+ * Data bits length defines:\r
+ */\r
+#define DATA_7_BITS     0x00u\r
+#define DATA_8_BITS     0x01u\r
+\r
+/***************************************************************************//**\r
+ * Parity defines:\r
+ */\r
+#define NO_PARITY       0x00u\r
+#define EVEN_PARITY     0x02u\r
+#define ODD_PARITY      0x06u\r
+\r
+/***************************************************************************//**\r
+ * Error Status definitions:\r
+ */\r
+#define UART_APB_PARITY_ERROR    0x01u\r
+#define UART_APB_OVERFLOW_ERROR  0x02u\r
+#define UART_APB_FRAMING_ERROR   0x04u\r
+#define UART_APB_NO_ERROR        0x00u\r
+#define UART_APB_INVALID_PARAM   0xFFu\r
+\r
+/***************************************************************************//**\r
+ * UART_instance_t\r
+ * \r
+ * There should be one instance of this structure for each instance of CoreUARTapb\r
+ * in your system. This structure instance is used to identify the various UARTs\r
+ * in a system and should be passed as first parameter to UART functions to \r
+ * identify which UART should perform the requested operation. The 'status' \r
+ * element in the structure is used to provide sticky status information. \r
+ */\r
+typedef struct\r
+{\r
+    addr_t      base_address;\r
+    uint8_t     status;\r
+} UART_instance_t;\r
+\r
+/***************************************************************************//**\r
+ * The function UART_init() initializes the UART with the configuration passed \r
+ * as parameters. The configuration parameters are the baud_value used to \r
+ * generate the baud rate and the line configuration (bit length and parity).\r
+ *\r
+ * @param this_uart   The this_uart parameter is a pointer to a UART_instance_t\r
+ *                    structure which holds all data regarding this instance of\r
+ *                    the CoreUARTapb. This pointer will be used to identify \r
+ *                    the target CoreUARTapb hardware instance in subsequent \r
+ *                    calls to the CoreUARTapb functions.\r
+ * @param base_addr   The base_address parameter is the base address in the \r
+ *                    processor's memory map for the registers of the \r
+ *                    CoreUARTapb instance being initialized.\r
+ * @param baud_value  The baud_value parameter is used to select the baud rate \r
+ *                    for the UART. The baud value is calculated from the \r
+ *                    frequency of the system clock in hertz and the desired \r
+ *                    baud rate using the following equation: \r
+ *                    \r
+ *                    baud_value = (clock /(baud_rate * 16)) - 1.\r
+ * \r
+ *                    The baud_value parameter must be a value in the range 0 \r
+ *                    to 8191 (or 0x0000 to 0x1FFF).\r
+ * @param line_config This parameter is the line configuration specifying the \r
+ *                    bit length and parity settings. This is a logical OR of:\r
+ *                      - DATA_7_BITS\r
+ *                    - DATA_8_BITS\r
+ *                    - NO_PARITY\r
+ *                    - EVEN_PARITY\r
+ *                    - ODD_PARITY\r
+ *                    For example, 8 bits even parity would be specified as \r
+ *                    (DATA_8_BITS | EVEN_PARITY). \r
+ * @return            This function does not return a value.\r
+ * Example:\r
+ * @code\r
+ *   #define BAUD_VALUE_57600    25\r
+ *   \r
+ *   #define COREUARTAPB0_BASE_ADDR      0xC3000000UL\r
+ *   \r
+ *   UART_instance_t g_uart;\r
+ *   int main()\r
+ *   {\r
+ *      UART_init(&g_uart, COREUARTAPB0_BASE_ADDR, \r
+                  BAUD_VALUE_57600, (DATA_8_BITS | EVEN_PARITY));\r
+ *   }\r
+ * @endcode\r
+ */\r
+void\r
+UART_init\r
+(\r
+    UART_instance_t * this_uart,\r
+    addr_t base_addr,\r
+    uint16_t baud_value,\r
+    uint8_t line_config\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The function UART_send() is used to transmit data. It transfers the contents\r
+ * of the transmitter data buffer, passed as a function parameter, into the \r
+ * UART's hardware transmitter FIFO. It returns when the full content of the \r
+ * transmitter data buffer has been transferred to the UART's transmitter FIFO. \r
+ *\r
+ * Note: you cannot assume that the data you are sending using this function has\r
+ * been received at the other end by the time this function returns. The actual\r
+ * transmit over the serial connection will still be taking place at the time of\r
+ * the function return. It is safe to release or reuse the memory used as the\r
+ * transmit buffer once this function returns.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a \r
+ *                      UART_instance_t structure which holds all data regarding \r
+ *                      this instance of the CoreUARTapbUART.\r
+ * @param tx_buffer     The tx_buffer parameter is a pointer to a buffer \r
+ *                      containing the data to be transmitted.\r
+ * @param tx_size       The tx_size parameter is the size, in bytes, of \r
+ *                      the data to be transmitted.\r
+ *\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ *   uint8_t testmsg1[] = {"\n\r\n\r\n\rUART_send() test message 1"};\r
+ *   UART_send(&g_uart,(const uint8_t *)&testmsg1,sizeof(testmsg1));\r
+ * @endcode\r
+ */\r
+void\r
+UART_send\r
+(\r
+    UART_instance_t * this_uart,\r
+    const uint8_t * tx_buffer,\r
+    size_t tx_size\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The function UART_fill_tx_fifo() fills the UART's transmitter hardware FIFO \r
+ * with the data found in the transmitter buffer that is passed in as a \r
+ * function parameter. The function returns either when the FIFO is full or \r
+ * when the complete contents of the transmitter buffer have been copied into \r
+ * the FIFO. It returns the number of bytes copied into the UART's transmitter\r
+ * hardware FIFO. This function is intended to be used as part of \r
+ * interrupt-driven transmission.\r
+ *\r
+ * Note:    You cannot assume that the data you transmit using this function has \r
+ *          been received at the other end by the time this function returns. \r
+ *          The actual transmission over the serial connection will still be \r
+ *          taking place at the time of the function return. \r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a UART_instance_t\r
+ *                      structure which holds all data regarding this instance of\r
+ *                      the UART.\r
+ * @param tx_buffer     The tx_buffer parameter is a pointer to a buffer \r
+ *                      containing the data to be transmitted.\r
+ * @param tx_size       The tx_size parameter is the size in bytes, of the data \r
+ *                      to be transmitted.\r
+ * @return              This function returns the number of bytes copied \r
+ *                      into the UART's transmitter hardware FIFO. \r
+ *\r
+ * Example:\r
+ * @code\r
+ *   void send_using_interrupt\r
+ *   (\r
+ *       uint8_t * pbuff,\r
+ *       size_t tx_size\r
+ *   )\r
+ *   {\r
+ *       size_t size_in_fifo;\r
+ *       size_in_fifo = UART_fill_tx_fifo( &g_uart, pbuff, tx_size );\r
+ *   }\r
+ * @endcode\r
+ */\r
+size_t\r
+UART_fill_tx_fifo\r
+(\r
+    UART_instance_t * this_uart,\r
+    const uint8_t * tx_buffer,\r
+    size_t tx_size\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The function UART_get_rx() reads the content of the UART's receiver hardware \r
+ * FIFO and stores it in the receiver buffer that is passed in as a function \r
+ * parameter. It copies either the full contents of the FIFO into the receiver \r
+ * buffer, or just enough data from the FIFO to fill the receiver buffer, \r
+ * dependent upon the size of the receiver buffer.  The size of the receiver \r
+ * buffer is passed in as a function parameter. UART_get_rx() returns the number\r
+ * of bytes copied into the receiver buffer. If no data was received at the time\r
+ * the function is called, the function returns 0.\r
+ *\r
+ * Note:    This function reads and accumulates the receiver status of the \r
+ *          CoreUARTapb instance before reading each byte from the receiver's \r
+ *          data register/FIFO. This allows the driver to maintain a sticky \r
+ *          record of any receiver errors that occur as the UART receives each \r
+ *          data byte; receiver errors would otherwise be lost after each read \r
+ *          from the receiver's data register. A call to the UART_get_rx_status()\r
+ *          function returns any receiver errors accumulated during the execution\r
+ *          of the UART_get_rx() function.\r
+ * Note:    When FIFO mode is disabled in the CoreUARTapb hardware configuration,\r
+ *          the driver accumulates a sticky record of any parity errors, framing \r
+ *          errors or overflow errors. When FIFO mode is enabled, the driver \r
+ *          accumulates a sticky record of overflow errors only; in this case \r
+ *          interrupts must be used to handle parity errors or framing errors.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a UART_instance_t \r
+ *                      structure which holds all data regarding this instance of \r
+ *                      the UART.\r
+ * @param rx_buffer     The rx_buffer parameter is a pointer to a buffer where the \r
+ *                      received data will be copied.\r
+ * @param buff_size     The buff_size parameter is the size of the receive buffer \r
+ *                      in bytes.\r
+ * @return              This function returns the number of bytes copied into the \r
+ *                      receive buffer.\r
+ *\r
+ * Example:\r
+ * @code\r
+ *   #define MAX_RX_DATA_SIZE    256\r
+ *   \r
+ *   uint8_t rx_data[MAX_RX_DATA_SIZE];\r
+ *   uint8_t rx_size = 0;\r
+ *           \r
+ *   rx_size = UART_get_rx( &g_uart, rx_data, sizeof(rx_data) );\r
+ * @endcode\r
+ */\r
+size_t\r
+UART_get_rx\r
+(\r
+    UART_instance_t * this_uart,\r
+    uint8_t * rx_buffer,\r
+    size_t buff_size\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The function UART_polled_tx_string() is used to transmit a NULL ('\0') \r
+ * terminated string. Internally, it polls for the transmit ready status and\r
+ * transfers the text starting at the address pointed to by p_sz_string into\r
+ * the UART's hardware transmitter FIFO. It is a blocking function and returns\r
+ * only when the complete string has been transferred to the UART's transmit \r
+ * FIFO.\r
+ *\r
+ * Note:    You cannot assume that the data you transmit using this function \r
+ *          has been received at the other end by the time this function \r
+ *          returns. The actual transmission over the serial connection will\r
+ *          still be taking place at the time of the function return.\r
+ *\r
+ * @param this_uart     The this_uart parameter is a pointer to a \r
+ *                      UART_instance_t structure which holds\r
+ *                      all data regarding this instance of the UART.\r
+ * @param p_sz_string   The p_sz_string parameter is a pointer to a buffer\r
+ *                      containing the NULL ('\0') terminated string to be \r
+ *                      transmitted.\r
+ * @return              This function does not return a value.\r
+ *\r
+ * Example:\r
+ * @code\r
+ *   uint8_t testmsg1[] = {"\r\n\r\nUART_polled_tx_string() test message 1\0"};\r
+ *   UART_polled_tx_string(&g_uart,(const uint8_t *)&testmsg1);\r
+ * @endcode\r
+ */\r
+void \r
+UART_polled_tx_string\r
+( \r
+    UART_instance_t * this_uart, \r
+    const uint8_t * p_sz_string\r
+);\r
+\r
+/***************************************************************************//**\r
+ * The UART_get_rx_status() function returns the receiver error status of the \r
+ * CoreUARTapb instance. It reads both the current error status of the receiver\r
+ * and the accumulated error status from preceding calls to the UART_get_rx() \r
+ * function and combines them using a bitwise OR. It returns the cumulative \r
+ * parity, framing and overflow error status of the receiver, since the \r
+ * previous call to UART_get_rx_status(), as an 8-bit encoded value.\r
+ *\r
+ * Note:    The UART_get_rx() function reads and accumulates the receiver status \r
+ *          of the CoreUARTapb instance before reading each byte from the \r
+ *          receiver's data register/FIFO. The driver maintains a sticky record \r
+ *          of the cumulative error status, which persists after the \r
+ *          UART_get_rx() function returns. The UART_get_rx_status() function \r
+ *          clears this accumulated record of receiver errors before returning.\r
+ * \r
+ * @param this_uart     The this_uart parameter is a pointer to a UART_instance_t\r
+ *                      structure which holds all data regarding this instance \r
+ *                      of the UART.\r
+ * @return              This function returns the UART receiver error status as \r
+ *                      an 8-bit encoded value. The returned value is 0 if no \r
+ *                      receiver errors occurred. The driver provides a set of \r
+ *                      bit mask constants which should be compared with and/or\r
+ *                      used to mask the returned value to determine the \r
+ *                      receiver error status. \r
+ *                      When the return value is compared to the following bit \r
+ *                      masks, a non-zero result indicates that the \r
+ *                      corresponding error occurred:\r
+ *                      UART_APB_PARITY_ERROR    (bit mask = 0x01)\r
+ *                      UART_APB_OVERFLOW_ERROR  (bit mask = 0x02)\r
+ *                      UART_APB_FRAMING_ERROR   (bit mask = 0x04)\r
+ *                      When the return value is compared to the following bit \r
+ *                      mask, a non-zero result indicates that no error occurred:\r
+ *                      UART_APB_NO_ERROR        (0x00)\r
+ *\r
+ * Example:\r
+ * @code\r
+ *   UART_instance_t g_uart;\r
+ *   uint8_t rx_data[MAX_RX_DATA_SIZE];\r
+ *   uint8_t err_status;\r
+ *   err_status = UART_get_err_status(&g_uart);\r
+ *   \r
+ *   if(UART_APB_NO_ERROR == err_status )\r
+ *   {\r
+ *        rx_size = UART_get_rx( &g_uart, rx_data, MAX_RX_DATA_SIZE );\r
+ *   }\r
+ * @endcode\r
+ */\r
+uint8_t\r
+UART_get_rx_status\r
+(\r
+    UART_instance_t * this_uart\r
+);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __CORE_UART_APB_H */\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/coreuartapb_regs.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/drivers/CoreUARTapb/coreuartapb_regs.h
new file mode 100644 (file)
index 0000000..e6cc8c1
--- /dev/null
@@ -0,0 +1,130 @@
+/*******************************************************************************\r
+ * (c) Copyright 2007-2017 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * SVN $Revision: 9082 $\r
+ * SVN $Date: 2017-04-28 11:51:36 +0530 (Fri, 28 Apr 2017) $\r
+ */\r
+\r
+#ifndef __CORE_UART_APB_REGISTERS\r
+#define __CORE_UART_APB_REGISTERS   1\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/*------------------------------------------------------------------------------\r
+ * TxData register details\r
+ */\r
+#define TXDATA_REG_OFFSET   0x0u\r
+\r
+/*\r
+ * TxData bits.\r
+ */\r
+#define TXDATA_OFFSET   0x0u\r
+#define TXDATA_MASK     0xFFu\r
+#define TXDATA_SHIFT    0u\r
+\r
+/*------------------------------------------------------------------------------\r
+ * RxData register details\r
+ */\r
+#define RXDATA_REG_OFFSET   0x4u\r
+\r
+/*\r
+ * RxData bits.\r
+ */\r
+#define RXDATA_OFFSET   0x4u\r
+#define RXDATA_MASK     0xFFu\r
+#define RXDATA_SHIFT    0u\r
+\r
+/*------------------------------------------------------------------------------\r
+ * ControReg1 register details\r
+ */\r
+#define CTRL1_REG_OFFSET        0x8u\r
+\r
+/*\r
+ * Baud value (Lower 8-bits)\r
+ */\r
+#define CTRL1_BAUDVALUE_OFFSET   0x8u\r
+#define CTRL1_BAUDVALUE_MASK     0xFFu\r
+#define CTRL1_BAUDVALUE_SHIFT    0u\r
+\r
+/*------------------------------------------------------------------------------\r
+ * ControReg2 register details\r
+ */\r
+#define CTRL2_REG_OFFSET          0xCu\r
+\r
+/*\r
+ * Bit length\r
+ */\r
+#define CTRL2_BIT_LENGTH_OFFSET   0xCu\r
+#define CTRL2_BIT_LENGTH_MASK     0x01u\r
+#define CTRL2_BIT_LENGTH_SHIFT    0u\r
+\r
+/*\r
+ * Parity enable.\r
+ */\r
+#define CTRL2_PARITY_EN_OFFSET    0xCu\r
+#define CTRL2_PARITY_EN_MASK      0x02u\r
+#define CTRL2_PARITY_EN_SHIFT     1u\r
+\r
+/*\r
+ * Odd/even parity selection.\r
+ */\r
+#define CTRL2_ODD_EVEN_OFFSET     0xCu\r
+#define CTRL2_ODD_EVEN_MASK       0x04u\r
+#define CTRL2_ODD_EVEN_SHIFT      2u\r
+\r
+/*\r
+ *  Baud value (Higher 5-bits)\r
+ */\r
+#define CTRL2_BAUDVALUE_OFFSET    0xCu\r
+#define CTRL2_BAUDVALUE_MASK      0xF8u\r
+#define CTRL2_BAUDVALUE_SHIFT     3u\r
+\r
+/*------------------------------------------------------------------------------\r
+ * StatusReg register details\r
+ */\r
+#define StatusReg_REG_OFFSET    0x10u\r
+\r
+#define STATUS_REG_OFFSET       0x10u\r
+\r
+/*\r
+ * Transmit ready.\r
+ */\r
+#define STATUS_TXRDY_OFFSET   0x10u\r
+#define STATUS_TXRDY_MASK     0x01u\r
+#define STATUS_TXRDY_SHIFT    0u\r
+\r
+/*\r
+ * Receive full.\r
+ */\r
+#define STATUS_RXFULL_OFFSET   0x10u\r
+#define STATUS_RXFULL_MASK     0x02u\r
+#define STATUS_RXFULL_SHIFT    1u\r
+\r
+/*\r
+ * Parity error.\r
+ */\r
+#define STATUS_PARITYERR_OFFSET   0x10u\r
+#define STATUS_PARITYERR_MASK     0x04u\r
+#define STATUS_PARITYERR_SHIFT    2u\r
+\r
+/*\r
+ * Overflow.\r
+ */\r
+#define STATUS_OVERFLOW_OFFSET   0x10u\r
+#define STATUS_OVERFLOW_MASK     0x08u\r
+#define STATUS_OVERFLOW_SHIFT    3u\r
+\r
+/*\r
+ * Frame Error.\r
+ */\r
+#define STATUS_FRAMERR_OFFSET   0x10u\r
+#define STATUS_FRAMERR_MASK     0x10u\r
+#define STATUS_FRAMERR_SHIFT    4u\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __CORE_UART_APB_REGISTERS */\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/cpu_types.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/cpu_types.h
new file mode 100644 (file)
index 0000000..1beae8c
--- /dev/null
@@ -0,0 +1,31 @@
+/*******************************************************************************\r
+ * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * SVN $Revision: 9661 $\r
+ * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
+ */\r
+#ifndef __CPU_TYPES_H\r
+#define __CPU_TYPES_H   1\r
+\r
+#include <stdint.h>\r
+\r
+/*------------------------------------------------------------------------------\r
+ */\r
+typedef unsigned int size_t;\r
+\r
+/*------------------------------------------------------------------------------\r
+ * addr_t: address type.\r
+ * Used to specify the address of peripherals present in the processor's memory\r
+ * map.\r
+ */\r
+typedef unsigned int addr_t;\r
+\r
+/*------------------------------------------------------------------------------\r
+ * psr_t: processor state register.\r
+ * Used by HAL_disable_interrupts() and HAL_restore_interrupts() to store the\r
+ * processor's state between disabling and restoring interrupts.\r
+ */\r
+typedef unsigned int psr_t;\r
+\r
+#endif  /* __CPU_TYPES_H */\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hal.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hal.h
new file mode 100644 (file)
index 0000000..5b82ed0
--- /dev/null
@@ -0,0 +1,207 @@
+/***************************************************************************//**\r
+ * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * Hardware abstraction layer functions.\r
+ * \r
+ * SVN $Revision: 9661 $\r
+ * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
+ */\r
+#ifndef HAL_H_\r
+#define HAL_H_\r
+\r
+#include "cpu_types.h"\r
+#include "hw_reg_access.h"\r
+\r
+/***************************************************************************//**\r
+ * Enable all interrupts at the processor level.\r
+ */\r
+void HAL_enable_interrupts( void );\r
+\r
+/***************************************************************************//**\r
+ * Disable all interrupts at the processor core level.\r
+ * Return the interrupts enable state before disabling occured so that it can \r
+ * later be restored. \r
+ */\r
+psr_t HAL_disable_interrupts( void );\r
+\r
+/***************************************************************************//**\r
+ * Restore the interrupts enable state at the processor core level.\r
+ * This function is normally passed the value returned from a previous call to\r
+ * HAL_disable_interrupts(). \r
+ */\r
+void HAL_restore_interrupts( psr_t saved_psr );\r
+\r
+/***************************************************************************//**\r
+ */\r
+#define FIELD_OFFSET(FIELD_NAME)  (FIELD_NAME##_OFFSET)\r
+#define FIELD_SHIFT(FIELD_NAME)   (FIELD_NAME##_SHIFT)\r
+#define FIELD_MASK(FIELD_NAME)    (FIELD_NAME##_MASK)\r
+\r
+/***************************************************************************//**\r
+ * The macro HAL_set_32bit_reg() allows writing a 32 bits wide register.\r
+ *\r
+ * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
+ *              peripheral containing the register.\r
+ * REG_NAME:    A string identifying the register to write. These strings are\r
+ *              specified in a header file associated with the peripheral.\r
+ * VALUE:       A variable of type uint32_t containing the value to write.\r
+ */\r
+#define HAL_set_32bit_reg(BASE_ADDR, REG_NAME, VALUE) \\r
+          (HW_set_32bit_reg( ((BASE_ADDR) + (REG_NAME##_REG_OFFSET)), (VALUE) ))\r
+\r
+/***************************************************************************//**\r
+ * The macro HAL_get_32bit_reg() is used to read the value  of a 32 bits wide\r
+ * register.\r
+ * \r
+ * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
+ *              peripheral containing the register.\r
+ * REG_NAME:    A string identifying the register to read. These strings are\r
+ *              specified in a header file associated with the peripheral.\r
+ * RETURN:      This function-like macro returns a uint32_t value.\r
+ */\r
+#define HAL_get_32bit_reg(BASE_ADDR, REG_NAME) \\r
+          (HW_get_32bit_reg( ((BASE_ADDR) + (REG_NAME##_REG_OFFSET)) ))\r
+\r
+/***************************************************************************//**\r
+ * The macro HAL_set_32bit_reg_field() is used to write a field within a\r
+ * 32 bits wide register. The field written can be one or more bits.\r
+ * \r
+ * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
+ *              peripheral containing the register.\r
+ * FIELD_NAME:  A string identifying the register field to write. These strings\r
+ *              are specified in a header file associated with the peripheral.\r
+ * VALUE:       A variable of type uint32_t containing the field value to write.\r
+ */\r
+#define HAL_set_32bit_reg_field(BASE_ADDR, FIELD_NAME, VALUE) \\r
+            (HW_set_32bit_reg_field(\\r
+                (BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\\r
+                FIELD_SHIFT(FIELD_NAME),\\r
+                FIELD_MASK(FIELD_NAME),\\r
+                (VALUE)))\r
+  \r
+/***************************************************************************//**\r
+ * The macro HAL_get_32bit_reg_field() is used to read a register field from\r
+ * within a 32 bit wide peripheral register. The field can be one or more bits.\r
+ * \r
+ * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
+ *              peripheral containing the register.\r
+ * FIELD_NAME:  A string identifying the register field to write. These strings\r
+ *              are specified in a header file associated with the peripheral.\r
+ * RETURN:      This function-like macro returns a uint32_t value.\r
+ */\r
+#define HAL_get_32bit_reg_field(BASE_ADDR, FIELD_NAME) \\r
+            (HW_get_32bit_reg_field(\\r
+                (BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\\r
+                FIELD_SHIFT(FIELD_NAME),\\r
+                FIELD_MASK(FIELD_NAME)))\r
+  \r
+/***************************************************************************//**\r
+ * The macro HAL_set_16bit_reg() allows writing a 16 bits wide register.\r
+ *\r
+ * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
+ *              peripheral containing the register.\r
+ * REG_NAME:    A string identifying the register to write. These strings are\r
+ *              specified in a header file associated with the peripheral.\r
+ * VALUE:       A variable of type uint_fast16_t containing the value to write.\r
+ */\r
+#define HAL_set_16bit_reg(BASE_ADDR, REG_NAME, VALUE) \\r
+            (HW_set_16bit_reg( ((BASE_ADDR) + (REG_NAME##_REG_OFFSET)), (VALUE) ))\r
+\r
+/***************************************************************************//**\r
+ * The macro HAL_get_16bit_reg() is used to read the value  of a 16 bits wide\r
+ * register.\r
+ * \r
+ * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
+ *              peripheral containing the register.\r
+ * REG_NAME:    A string identifying the register to read. These strings are\r
+ *              specified in a header file associated with the peripheral.\r
+ * RETURN:      This function-like macro returns a uint16_t value.\r
+ */\r
+#define HAL_get_16bit_reg(BASE_ADDR, REG_NAME) \\r
+            (HW_get_16bit_reg( (BASE_ADDR) + (REG_NAME##_REG_OFFSET) ))\r
+\r
+/***************************************************************************//**\r
+ * The macro HAL_set_16bit_reg_field() is used to write a field within a\r
+ * 16 bits wide register. The field written can be one or more bits.\r
+ * \r
+ * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
+ *              peripheral containing the register.\r
+ * FIELD_NAME:  A string identifying the register field to write. These strings\r
+ *              are specified in a header file associated with the peripheral.\r
+ * VALUE:       A variable of type uint16_t containing the field value to write.\r
+ */\r
+#define HAL_set_16bit_reg_field(BASE_ADDR, FIELD_NAME, VALUE) \\r
+            (HW_set_16bit_reg_field(\\r
+                (BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\\r
+                FIELD_SHIFT(FIELD_NAME),\\r
+                FIELD_MASK(FIELD_NAME),\\r
+                (VALUE)))  \r
+\r
+/***************************************************************************//**\r
+ * The macro HAL_get_16bit_reg_field() is used to read a register field from\r
+ * within a 8 bit wide peripheral register. The field can be one or more bits.\r
+ * \r
+ * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
+ *              peripheral containing the register.\r
+ * FIELD_NAME:  A string identifying the register field to write. These strings\r
+ *              are specified in a header file associated with the peripheral.\r
+ * RETURN:      This function-like macro returns a uint16_t value.\r
+ */\r
+#define HAL_get_16bit_reg_field(BASE_ADDR, FIELD_NAME) \\r
+            (HW_get_16bit_reg_field(\\r
+                (BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\\r
+                FIELD_SHIFT(FIELD_NAME),\\r
+                FIELD_MASK(FIELD_NAME)))\r
+\r
+/***************************************************************************//**\r
+ * The macro HAL_set_8bit_reg() allows writing a 8 bits wide register.\r
+ *\r
+ * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
+ *              peripheral containing the register.\r
+ * REG_NAME:    A string identifying the register to write. These strings are\r
+ *              specified in a header file associated with the peripheral.\r
+ * VALUE:       A variable of type uint_fast8_t containing the value to write.\r
+ */\r
+#define HAL_set_8bit_reg(BASE_ADDR, REG_NAME, VALUE) \\r
+          (HW_set_8bit_reg( ((BASE_ADDR) + (REG_NAME##_REG_OFFSET)), (VALUE) ))\r
+\r
+/***************************************************************************//**\r
+ * The macro HAL_get_8bit_reg() is used to read the value of a 8 bits wide\r
+ * register.\r
+ * \r
+ * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
+ *              peripheral containing the register.\r
+ * REG_NAME:    A string identifying the register to read. These strings are\r
+ *              specified in a header file associated with the peripheral.\r
+ * RETURN:      This function-like macro returns a uint8_t value.\r
+ */\r
+#define HAL_get_8bit_reg(BASE_ADDR, REG_NAME) \\r
+          (HW_get_8bit_reg( (BASE_ADDR) + (REG_NAME##_REG_OFFSET) ))\r
+\r
+/***************************************************************************//**\r
+ */\r
+#define HAL_set_8bit_reg_field(BASE_ADDR, FIELD_NAME, VALUE) \\r
+            (HW_set_8bit_reg_field(\\r
+                (BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\\r
+                FIELD_SHIFT(FIELD_NAME),\\r
+                FIELD_MASK(FIELD_NAME),\\r
+                (VALUE)))\r
+\r
+/***************************************************************************//**\r
+ * The macro HAL_get_8bit_reg_field() is used to read a register field from\r
+ * within a 8 bit wide peripheral register. The field can be one or more bits.\r
+ * \r
+ * BASE_ADDR:   A variable of type addr_t specifying the base address of the\r
+ *              peripheral containing the register.\r
+ * FIELD_NAME:  A string identifying the register field to write. These strings\r
+ *              are specified in a header file associated with the peripheral.\r
+ * RETURN:      This function-like macro returns a uint8_t value.\r
+ */\r
+#define HAL_get_8bit_reg_field(BASE_ADDR, FIELD_NAME) \\r
+            (HW_get_8bit_reg_field(\\r
+                (BASE_ADDR) + FIELD_OFFSET(FIELD_NAME),\\r
+                FIELD_SHIFT(FIELD_NAME),\\r
+                FIELD_MASK(FIELD_NAME)))\r
+  \r
+#endif /*HAL_H_*/\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hal_assert.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hal_assert.h
new file mode 100644 (file)
index 0000000..db8ab77
--- /dev/null
@@ -0,0 +1,29 @@
+/*******************************************************************************\r
+ * (c) Copyright 2008-2018 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * SVN $Revision: 9661 $\r
+ * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
+ */\r
+#ifndef HAL_ASSERT_HEADER\r
+#define HAL_ASSERT_HEADER\r
+\r
+#define NDEBUG 1\r
+\r
+#if defined(NDEBUG)\r
+/***************************************************************************//**\r
+ * HAL_ASSERT() is defined out when the NDEBUG symbol is used.\r
+ ******************************************************************************/\r
+#define HAL_ASSERT(CHECK)\r
+\r
+#else\r
+/***************************************************************************//**\r
+ * Default behaviour for HAL_ASSERT() macro:\r
+ *------------------------------------------------------------------------------\r
+  The behaviour is toolchain specific and project setting specific.\r
+ ******************************************************************************/\r
+#define HAL_ASSERT(CHECK)     ASSERT(CHECK);\r
+\r
+#endif  /* NDEBUG */\r
+\r
+#endif  /* HAL_ASSERT_HEADER */\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hal_irq.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hal_irq.c
new file mode 100644 (file)
index 0000000..52f6301
--- /dev/null
@@ -0,0 +1,36 @@
+/***************************************************************************//**\r
+ * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * Legacy interrupt control functions for the Microsemi driver library hardware\r
+ * abstraction layer.\r
+ *\r
+ * SVN $Revision: 9661 $\r
+ * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
+ */\r
+#include "hal.h"\r
+#include "riscv_hal.h"\r
+\r
+/*------------------------------------------------------------------------------\r
+ * \r
+ */\r
+void HAL_enable_interrupts(void) {\r
+    __enable_irq();\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * \r
+ */\r
+psr_t HAL_disable_interrupts(void) {\r
+    psr_t psr;\r
+    psr = read_csr(mstatus);\r
+    __disable_irq();\r
+    return(psr);\r
+}\r
+\r
+/*------------------------------------------------------------------------------\r
+ * \r
+ */\r
+void HAL_restore_interrupts(psr_t saved_psr) {\r
+    write_csr(mstatus, saved_psr);\r
+}\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hw_macros.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hw_macros.h
new file mode 100644 (file)
index 0000000..2149544
--- /dev/null
@@ -0,0 +1,97 @@
+/*******************************************************************************\r
+ * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ *  Hardware registers access macros.\r
+ * \r
+ *  THE MACROS DEFINED IN THIS FILE ARE DEPRECATED. DO NOT USED FOR NEW \r
+ *  DEVELOPMENT.\r
+ *\r
+ * These macros are used to access peripheral's registers. They allow access to\r
+ * 8, 16 and 32 bit wide registers. All accesses to peripheral registers should\r
+ * be done through these macros in order to ease porting across different \r
+ * processors/bus architectures.\r
+ * \r
+ * Some of these macros also allow to access a specific register field.\r
+ * \r
+ * SVN $Revision: 9661 $\r
+ * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
+ */\r
+#ifndef __HW_REGISTER_MACROS_H\r
+#define __HW_REGISTER_MACROS_H 1\r
+\r
+/*------------------------------------------------------------------------------\r
+ * 32 bits registers access:\r
+ */\r
+#define HW_get_uint32_reg(BASE_ADDR, REG_OFFSET) (*((uint32_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)))\r
+\r
+#define HW_set_uint32_reg(BASE_ADDR, REG_OFFSET, VALUE) (*((uint32_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)) = (VALUE))\r
+\r
+#define HW_set_uint32_reg_field(BASE_ADDR, FIELD, VALUE) \\r
+            (*((uint32_t volatile *)(BASE_ADDR + FIELD##_OFFSET)) =  \\r
+                ( \\r
+                    (uint32_t) \\r
+                    ( \\r
+                    (*((uint32_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & ~FIELD##_MASK) | \\r
+                    (uint32_t)(((VALUE) << FIELD##_SHIFT) & FIELD##_MASK) \\r
+                ) \\r
+            )\r
+\r
+#define HW_get_uint32_reg_field( BASE_ADDR, FIELD ) \\r
+            (( (*((uint32_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & FIELD##_MASK) >> FIELD##_SHIFT)\r
+\r
+/*------------------------------------------------------------------------------\r
+ * 32 bits memory access:\r
+ */\r
+#define HW_get_uint32(BASE_ADDR) (*((uint32_t volatile *)(BASE_ADDR)))\r
+\r
+#define HW_set_uint32(BASE_ADDR, VALUE) (*((uint32_t volatile *)(BASE_ADDR)) = (VALUE))\r
+\r
+/*------------------------------------------------------------------------------\r
+ * 16 bits registers access:\r
+ */\r
+#define HW_get_uint16_reg(BASE_ADDR, REG_OFFSET) (*((uint16_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)))\r
+\r
+#define HW_set_uint16_reg(BASE_ADDR, REG_OFFSET, VALUE) (*((uint16_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)) = (VALUE))\r
+\r
+#define HW_set_uint16_reg_field(BASE_ADDR, FIELD, VALUE) \\r
+            (*((uint16_t volatile *)(BASE_ADDR + FIELD##_OFFSET)) =  \\r
+                ( \\r
+                    (uint16_t) \\r
+                    ( \\r
+                    (*((uint16_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & ~FIELD##_MASK) | \\r
+                    (uint16_t)(((VALUE) << FIELD##_SHIFT) & FIELD##_MASK) \\r
+                ) \\r
+            )\r
+\r
+#define HW_get_uint16_reg_field( BASE_ADDR, FIELD ) \\r
+            (( (*((uint16_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & FIELD##_MASK) >> FIELD##_SHIFT)\r
+\r
+/*------------------------------------------------------------------------------\r
+ * 8 bits registers access:\r
+ */\r
+#define HW_get_uint8_reg(BASE_ADDR, REG_OFFSET) (*((uint8_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)))\r
+\r
+#define HW_set_uint8_reg(BASE_ADDR, REG_OFFSET, VALUE) (*((uint8_t volatile *)(BASE_ADDR + REG_OFFSET##_REG_OFFSET)) = (VALUE))\r
\r
+#define HW_set_uint8_reg_field(BASE_ADDR, FIELD, VALUE) \\r
+            (*((uint8_t volatile *)(BASE_ADDR + FIELD##_OFFSET)) =  \\r
+                ( \\r
+                    (uint8_t) \\r
+                    ( \\r
+                    (*((uint8_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & ~FIELD##_MASK) | \\r
+                    (uint8_t)(((VALUE) << FIELD##_SHIFT) & FIELD##_MASK) \\r
+                ) \\r
+            )\r
+\r
+#define HW_get_uint8_reg_field( BASE_ADDR, FIELD ) \\r
+            (( (*((uint8_t volatile *)(BASE_ADDR + FIELD##_OFFSET))) & FIELD##_MASK) >> FIELD##_SHIFT)\r
+\r
+/*------------------------------------------------------------------------------\r
+ * 8 bits memory access:\r
+ */\r
+#define HW_get_uint8(BASE_ADDR) (*((uint8_t volatile *)(BASE_ADDR)))\r
+\r
+#define HW_set_uint8(BASE_ADDR, VALUE) (*((uint8_t volatile *)(BASE_ADDR)) = (VALUE))\r
\r
+#endif  /* __HW_REGISTER_MACROS_H */\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hw_reg_access.S b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hw_reg_access.S
new file mode 100644 (file)
index 0000000..68d93dd
--- /dev/null
@@ -0,0 +1,209 @@
+/***************************************************************************//**\r
+ * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
+ *\r
+ * Hardware registers access functions.\r
+ * The implementation of these function is platform and toolchain specific.\r
+ * The functions declared here are implemented using assembler as part of the\r
+ * processor/toolchain specific HAL.\r
+ *\r
+ * SVN $Revision: 9661 $\r
+ * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
+ */\r
+\r
+.section .text\r
+    .globl HW_set_32bit_reg\r
+    .globl HW_get_32bit_reg\r
+    .globl HW_set_32bit_reg_field\r
+    .globl HW_get_32bit_reg_field\r
+    .globl HW_set_16bit_reg\r
+    .globl HW_get_16bit_reg\r
+    .globl HW_set_16bit_reg_field\r
+    .globl HW_get_16bit_reg_field\r
+    .globl HW_set_8bit_reg\r
+    .globl HW_get_8bit_reg\r
+    .globl HW_set_8bit_reg_field\r
+    .globl HW_get_8bit_reg_field\r
+\r
+\r
+/***************************************************************************//**\r
+ * HW_set_32bit_reg is used to write the content of a 32 bits wide peripheral\r
+ * register.\r
+ *\r
+ * a0:   addr_t reg_addr\r
+ * a1:   uint32_t value\r
+ */\r
+HW_set_32bit_reg:\r
+    sw a1, 0(a0)\r
+    ret\r
+\r
+/***************************************************************************//**\r
+ * HW_get_32bit_reg is used to read the content of a 32 bits wide peripheral\r
+ * register.\r
+ *\r
+ * R0:   addr_t reg_addr\r
+ * @return          32 bits value read from the peripheral register.\r
+ */\r
+HW_get_32bit_reg:\r
+    lw a0, 0(a0)\r
+    ret\r
+\r
+/***************************************************************************//**\r
+ * HW_set_32bit_reg_field is used to set the content of a field in a 32 bits\r
+ * wide peripheral register.\r
+ *\r
+ * a0:   addr_t reg_addr\r
+ * a1:   int_fast8_t shift\r
+ * a2:   uint32_t mask\r
+ * a3:   uint32_t value\r
+ */\r
+HW_set_32bit_reg_field:\r
+    mv t3, a3\r
+    sll t3, t3, a1\r
+    and  t3, t3, a2\r
+    lw t1, 0(a0)\r
+    mv t2, a2\r
+    not t2, t2\r
+    and t1, t1, t2\r
+    or t1, t1, t3\r
+    sw t1, 0(a0)\r
+    ret\r
+\r
+/***************************************************************************//**\r
+ * HW_get_32bit_reg_field is used to read the content of a field out of a\r
+ * 32 bits wide peripheral register.\r
+ *\r
+ * a0:   addr_t reg_addr\r
+ * a1:   int_fast8_t shift\r
+ * a2:   uint32_t mask\r
+ *\r
+ * @return          32 bits value containing the register field value specified\r
+ *                  as parameter.\r
+ */\r
+HW_get_32bit_reg_field:\r
+    lw a0, 0(a0)\r
+    and a0, a0, a2\r
+    srl a0, a0, a1\r
+    ret\r
+\r
+/***************************************************************************//**\r
+ * HW_set_16bit_reg is used to write the content of a 16 bits wide peripheral\r
+ * register.\r
+ *\r
+ * a0:   addr_t reg_addr\r
+ * a1:   uint_fast16_t value\r
+ */\r
+HW_set_16bit_reg:\r
+    sh a1, 0(a0)\r
+    ret\r
+\r
+/***************************************************************************//**\r
+ * HW_get_16bit_reg is used to read the content of a 16 bits wide peripheral\r
+ * register.\r
+ *\r
+ * a0:   addr_t reg_addr\r
+ * @return          16 bits value read from the peripheral register.\r
+ */\r
+HW_get_16bit_reg:\r
+    lh a0, (a0)\r
+    ret\r
+\r
+/***************************************************************************//**\r
+ * HW_set_16bit_reg_field is used to set the content of a field in a 16 bits\r
+ * wide peripheral register.\r
+ *\r
+ * a0:   addr_t reg_addr\r
+ * a1:   int_fast8_t shift\r
+ * a2:   uint_fast16_t mask\r
+ * a3:   uint_fast16_t value\r
+ * @param value     Value to be written in the specified field.\r
+ */\r
+HW_set_16bit_reg_field:\r
+    mv t3, a3\r
+    sll t3, t3, a1\r
+    and  t3, t3, a2\r
+    lh t1, 0(a0)\r
+    mv t2, a2\r
+    not t2, t2\r
+    and t1, t1, t2\r
+    or t1, t1, t3\r
+    sh t1, 0(a0)\r
+    ret\r
+\r
+/***************************************************************************//**\r
+ * HW_get_16bit_reg_field is used to read the content of a field from a\r
+ * 16 bits wide peripheral register.\r
+ *\r
+ * a0:   addr_t reg_addr\r
+ * a1:   int_fast8_t shift\r
+ * a2:   uint_fast16_t mask\r
+ *\r
+ * @return          16 bits value containing the register field value specified\r
+ *                  as parameter.\r
+ */\r
+HW_get_16bit_reg_field:\r
+    lh a0, 0(a0)\r
+    and a0, a0, a2\r
+    srl a0, a0, a1\r
+    ret\r
+\r
+/***************************************************************************//**\r
+ * HW_set_8bit_reg is used to write the content of a 8 bits wide peripheral\r
+ * register.\r
+ *\r
+ * a0:   addr_t reg_addr\r
+ * a1:   uint_fast8_t value\r
+ */\r
+HW_set_8bit_reg:\r
+    sb a1, 0(a0)\r
+    ret\r
+\r
+/***************************************************************************//**\r
+ * HW_get_8bit_reg is used to read the content of a 8 bits wide peripheral\r
+ * register.\r
+ *\r
+ * a0:   addr_t reg_addr\r
+ * @return          8 bits value read from the peripheral register.\r
+ */\r
+HW_get_8bit_reg:\r
+    lb a0, 0(a0)\r
+    ret\r
+\r
+/***************************************************************************//**\r
+ * HW_set_8bit_reg_field is used to set the content of a field in a 8 bits\r
+ * wide peripheral register.\r
+ *\r
+ * a0:   addr_t reg_addr,\r
+ * a1:   int_fast8_t shift\r
+ * a2:   uint_fast8_t mask\r
+ * a3:   uint_fast8_t value\r
+ */\r
+HW_set_8bit_reg_field:\r
+    mv t3, a3\r
+    sll t3, t3, a1\r
+    and  t3, t3, a2\r
+    lb t1, 0(a0)\r
+    mv t2, a2\r
+    not t2, t2\r
+    and t1, t1, t2\r
+    or t1, t1, t3\r
+    sb t1, 0(a0)\r
+    ret\r
+\r
+/***************************************************************************//**\r
+ * HW_get_8bit_reg_field is used to read the content of a field from a\r
+ * 8 bits wide peripheral register.\r
+ *\r
+ * a0:   addr_t reg_addr\r
+ * a1:   int_fast8_t shift\r
+ * a2:   uint_fast8_t mask\r
+ *\r
+ * @return          8 bits value containing the register field value specified\r
+ *                  as parameter.\r
+ */\r
+HW_get_8bit_reg_field:\r
+    lb a0, 0(a0)\r
+    and a0, a0, a2\r
+    srl a0, a0, a1\r
+    ret\r
+\r
+.end\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hw_reg_access.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/hal/hw_reg_access.h
new file mode 100644 (file)
index 0000000..bc3dd65
--- /dev/null
@@ -0,0 +1,229 @@
+/***************************************************************************//**\r
+ * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
+ * \r
+ * Hardware registers access functions.\r
+ * The implementation of these function is platform and toolchain specific.\r
+ * The functions declared here are implemented using assembler as part of the \r
+ * processor/toolchain specific HAL.\r
+ * \r
+ * SVN $Revision: 9661 $\r
+ * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
+ */\r
+#ifndef HW_REG_ACCESS\r
+#define HW_REG_ACCESS\r
+\r
+#include "cpu_types.h"\r
+/***************************************************************************//**\r
+ * HW_set_32bit_reg is used to write the content of a 32 bits wide peripheral\r
+ * register.\r
+ * \r
+ * @param reg_addr  Address in the processor's memory map of the register to\r
+ *                  write.\r
+ * @param value     Value to be written into the peripheral register.\r
+ */\r
+void\r
+HW_set_32bit_reg\r
+(\r
+    addr_t reg_addr,\r
+    uint32_t value\r
+);\r
+\r
+/***************************************************************************//**\r
+ * HW_get_32bit_reg is used to read the content of a 32 bits wide peripheral\r
+ * register.\r
+ * \r
+ * @param reg_addr  Address in the processor's memory map of the register to\r
+ *                  read.\r
+ * @return          32 bits value read from the peripheral register.\r
+ */\r
+uint32_t\r
+HW_get_32bit_reg\r
+(\r
+    addr_t reg_addr\r
+);\r
+\r
+/***************************************************************************//**\r
+ * HW_set_32bit_reg_field is used to set the content of a field in a 32 bits \r
+ * wide peripheral register.\r
+ * \r
+ * @param reg_addr  Address in the processor's memory map of the register to\r
+ *                  be written.\r
+ * @param shift     Bit offset of the register field to be read within the \r
+ *                  register.\r
+ * @param mask      Bit mask to be applied to the raw register value to filter\r
+ *                  out the other register fields values.\r
+ * @param value     Value to be written in the specified field.\r
+ */\r
+void\r
+HW_set_32bit_reg_field\r
+(\r
+    addr_t reg_addr,\r
+    int_fast8_t shift,\r
+    uint32_t mask,\r
+    uint32_t value\r
+);\r
+\r
+/***************************************************************************//**\r
+ * HW_get_32bit_reg_field is used to read the content of a field out of a \r
+ * 32 bits wide peripheral register.\r
+ * \r
+ * @param reg_addr  Address in the processor's memory map of the register to\r
+ *                  read.\r
+ * @param shift     Bit offset of the register field to be written within the \r
+ *                  register.\r
+ * @param mask      Bit mask to be applied to the raw register value to filter\r
+ *                  out the other register fields values.\r
+ *\r
+ * @return          32 bits value containing the register field value specified\r
+ *                  as parameter.\r
+ */\r
+uint32_t \r
+HW_get_32bit_reg_field\r
+(\r
+    addr_t reg_addr,\r
+    int_fast8_t shift,\r
+    uint32_t mask\r
+);\r
+\r
+/***************************************************************************//**\r
+ * HW_set_16bit_reg is used to write the content of a 16 bits wide peripheral\r
+ * register.\r
+ * \r
+ * @param reg_addr  Address in the processor's memory map of the register to\r
+ *                  write.\r
+ * @param value     Value to be written into the peripheral register.\r
+ */\r
+void\r
+HW_set_16bit_reg\r
+(\r
+    addr_t reg_addr,\r
+    uint_fast16_t value\r
+);\r
+\r
+/***************************************************************************//**\r
+ * HW_get_16bit_reg is used to read the content of a 16 bits wide peripheral\r
+ * register.\r
+ * \r
+ * @param reg_addr  Address in the processor's memory map of the register to\r
+ *                  read.\r
+ * @return          16 bits value read from the peripheral register.\r
+ */\r
+uint16_t\r
+HW_get_16bit_reg\r
+(\r
+    addr_t reg_addr\r
+);\r
+\r
+/***************************************************************************//**\r
+ * HW_set_16bit_reg_field is used to set the content of a field in a 16 bits \r
+ * wide peripheral register.\r
+ * \r
+ * @param reg_addr  Address in the processor's memory map of the register to\r
+ *                  be written.\r
+ * @param shift     Bit offset of the register field to be read within the \r
+ *                  register.\r
+ * @param mask      Bit mask to be applied to the raw register value to filter\r
+ *                  out the other register fields values.\r
+ * @param value     Value to be written in the specified field.\r
+ */\r
+void HW_set_16bit_reg_field\r
+(\r
+    addr_t reg_addr,\r
+    int_fast8_t shift,\r
+    uint_fast16_t mask,\r
+    uint_fast16_t value\r
+);\r
+\r
+/***************************************************************************//**\r
+ * HW_get_16bit_reg_field is used to read the content of a field from a \r
+ * 16 bits wide peripheral register.\r
+ * \r
+ * @param reg_addr  Address in the processor's memory map of the register to\r
+ *                  read.\r
+ * @param shift     Bit offset of the register field to be written within the \r
+ *                  register.\r
+ * @param mask      Bit mask to be applied to the raw register value to filter\r
+ *                  out the other register fields values.\r
+ *\r
+ * @return          16 bits value containing the register field value specified\r
+ *                  as parameter.\r
+ */\r
+uint16_t HW_get_16bit_reg_field\r
+(\r
+    addr_t reg_addr,\r
+    int_fast8_t shift,\r
+    uint_fast16_t mask\r
+);\r
+\r
+/***************************************************************************//**\r
+ * HW_set_8bit_reg is used to write the content of a 8 bits wide peripheral\r
+ * register.\r
+ * \r
+ * @param reg_addr  Address in the processor's memory map of the register to\r
+ *                  write.\r
+ * @param value     Value to be written into the peripheral register.\r
+ */\r
+void\r
+HW_set_8bit_reg\r
+(\r
+    addr_t reg_addr,\r
+    uint_fast8_t value\r
+);\r
+\r
+/***************************************************************************//**\r
+ * HW_get_8bit_reg is used to read the content of a 8 bits wide peripheral\r
+ * register.\r
+ * \r
+ * @param reg_addr  Address in the processor's memory map of the register to\r
+ *                  read.\r
+ * @return          8 bits value read from the peripheral register.\r
+ */\r
+uint8_t\r
+HW_get_8bit_reg\r
+(\r
+    addr_t reg_addr\r
+);\r
+\r
+/***************************************************************************//**\r
+ * HW_set_8bit_reg_field is used to set the content of a field in a 8 bits \r
+ * wide peripheral register.\r
+ * \r
+ * @param reg_addr  Address in the processor's memory map of the register to\r
+ *                  be written.\r
+ * @param shift     Bit offset of the register field to be read within the \r
+ *                  register.\r
+ * @param mask      Bit mask to be applied to the raw register value to filter\r
+ *                  out the other register fields values.\r
+ * @param value     Value to be written in the specified field.\r
+ */\r
+void HW_set_8bit_reg_field\r
+(\r
+    addr_t reg_addr,\r
+    int_fast8_t shift,\r
+    uint_fast8_t mask,\r
+    uint_fast8_t value\r
+);\r
+\r
+/***************************************************************************//**\r
+ * HW_get_8bit_reg_field is used to read the content of a field from a \r
+ * 8 bits wide peripheral register.\r
+ * \r
+ * @param reg_addr  Address in the processor's memory map of the register to\r
+ *                  read.\r
+ * @param shift     Bit offset of the register field to be written within the \r
+ *                  register.\r
+ * @param mask      Bit mask to be applied to the raw register value to filter\r
+ *                  out the other register fields values.\r
+ *\r
+ * @return          8 bits value containing the register field value specified\r
+ *                  as parameter.\r
+ */\r
+uint8_t HW_get_8bit_reg_field\r
+(\r
+    addr_t reg_addr,\r
+    int_fast8_t shift,\r
+    uint_fast8_t mask\r
+);\r
+\r
+#endif /* HW_REG_ACCESS */\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/encoding.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/encoding.h
new file mode 100644 (file)
index 0000000..aa379ee
--- /dev/null
@@ -0,0 +1,596 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
+ *\r
+ * @file encodings.h\r
+ * @author Microsemi SoC Products Group\r
+ * @brief Mi-V soft processor register bit mask and shift constants encodings.\r
+ *\r
+ * SVN $Revision: 9825 $\r
+ * SVN $Date: 2018-03-19 10:31:41 +0530 (Mon, 19 Mar 2018) $\r
+ */\r
+#ifndef RISCV_CSR_ENCODING_H\r
+#define RISCV_CSR_ENCODING_H\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#define MSTATUS_UIE         0x00000001\r
+#define MSTATUS_SIE         0x00000002\r
+#define MSTATUS_HIE         0x00000004\r
+#define MSTATUS_MIE         0x00000008\r
+#define MSTATUS_UPIE        0x00000010\r
+#define MSTATUS_SPIE        0x00000020\r
+#define MSTATUS_HPIE        0x00000040\r
+#define MSTATUS_MPIE        0x00000080\r
+#define MSTATUS_SPP         0x00000100\r
+#define MSTATUS_HPP         0x00000600\r
+#define MSTATUS_MPP         0x00001800\r
+#define MSTATUS_FS          0x00006000\r
+#define MSTATUS_XS          0x00018000\r
+#define MSTATUS_MPRV        0x00020000\r
+#define MSTATUS_SUM         0x00040000      /*changed in v1.10*/\r
+#define MSTATUS_MXR         0x00080000      /*changed in v1.10*/\r
+#define MSTATUS_TVM         0x00100000      /*changed in v1.10*/\r
+#define MSTATUS_TW          0x00200000      /*changed in v1.10*/\r
+#define MSTATUS_TSR         0x00400000      /*changed in v1.10*/\r
+#define MSTATUS_RES         0x7F800000      /*changed in v1.10*/\r
+#define MSTATUS32_SD        0x80000000\r
+#define MSTATUS64_SD        0x8000000000000000\r
+\r
+#define MCAUSE32_CAUSE       0x7FFFFFFF\r
+#define MCAUSE64_CAUSE       0x7FFFFFFFFFFFFFFF\r
+#define MCAUSE32_INT         0x80000000\r
+#define MCAUSE64_INT         0x8000000000000000\r
+\r
+#define SSTATUS_UIE         0x00000001\r
+#define SSTATUS_SIE         0x00000002\r
+#define SSTATUS_UPIE        0x00000010\r
+#define SSTATUS_SPIE        0x00000020\r
+#define SSTATUS_SPP         0x00000100\r
+#define SSTATUS_FS          0x00006000\r
+#define SSTATUS_XS          0x00018000\r
+#define SSTATUS_PUM         0x00040000\r
+#define SSTATUS32_SD        0x80000000\r
+#define SSTATUS64_SD        0x8000000000000000\r
+\r
+#define MIP_SSIP            (1u << IRQ_S_SOFT)\r
+#define MIP_HSIP            (1u << IRQ_H_SOFT)\r
+#define MIP_MSIP            (1u << IRQ_M_SOFT)\r
+#define MIP_STIP            (1u << IRQ_S_TIMER)\r
+#define MIP_HTIP            (1u << IRQ_H_TIMER)\r
+#define MIP_MTIP            (1u << IRQ_M_TIMER)\r
+#define MIP_SEIP            (1u << IRQ_S_EXT)\r
+#define MIP_HEIP            (1u << IRQ_H_EXT)\r
+#define MIP_MEIP            (1u << IRQ_M_EXT)\r
+\r
+#define SIP_SSIP            MIP_SSIP\r
+#define SIP_STIP            MIP_STIP\r
+\r
+#define PRV_U               0\r
+#define PRV_S               1\r
+#define PRV_H               2\r
+#define PRV_M               3\r
+\r
+#define VM_MBARE            0\r
+#define VM_MBB              1\r
+#define VM_MBBID            2\r
+#define VM_SV32             8\r
+#define VM_SV39             9\r
+#define VM_SV48             10\r
+\r
+#define IRQ_S_SOFT          1\r
+#define IRQ_H_SOFT          2\r
+#define IRQ_M_SOFT          3\r
+#define IRQ_S_TIMER         5\r
+#define IRQ_H_TIMER         6\r
+#define IRQ_M_TIMER         7\r
+#define IRQ_S_EXT           9\r
+#define IRQ_H_EXT           10\r
+#define IRQ_M_EXT           11\r
+\r
+#define DEFAULT_RSTVEC      0x00001000\r
+#define DEFAULT_NMIVEC      0x00001004\r
+#define DEFAULT_MTVEC       0x00001010\r
+#define CONFIG_STRING_ADDR  0x0000100C\r
+#define EXT_IO_BASE         0x40000000\r
+#define DRAM_BASE           0x80000000\r
+\r
+/* page table entry (PTE) fields */\r
+#define PTE_V               0x001       /* Valid */\r
+#define PTE_TYPE            0x01E       /* Type  */\r
+#define PTE_R               0x020       /* Referenced */\r
+#define PTE_D               0x040       /* Dirty */\r
+#define PTE_SOFT            0x380       /* Reserved for Software */\r
+\r
+#define PTE_TYPE_TABLE        0x00\r
+#define PTE_TYPE_TABLE_GLOBAL 0x02\r
+#define PTE_TYPE_URX_SR       0x04\r
+#define PTE_TYPE_URWX_SRW     0x06\r
+#define PTE_TYPE_UR_SR        0x08\r
+#define PTE_TYPE_URW_SRW      0x0A\r
+#define PTE_TYPE_URX_SRX      0x0C\r
+#define PTE_TYPE_URWX_SRWX    0x0E\r
+#define PTE_TYPE_SR           0x10\r
+#define PTE_TYPE_SRW          0x12\r
+#define PTE_TYPE_SRX          0x14\r
+#define PTE_TYPE_SRWX         0x16\r
+#define PTE_TYPE_SR_GLOBAL    0x18\r
+#define PTE_TYPE_SRW_GLOBAL   0x1A\r
+#define PTE_TYPE_SRX_GLOBAL   0x1C\r
+#define PTE_TYPE_SRWX_GLOBAL  0x1E\r
+\r
+#define PTE_PPN_SHIFT 10\r
+\r
+#define PTE_TABLE(PTE) ((0x0000000AU >> ((PTE) & 0x1F)) & 1)\r
+#define PTE_UR(PTE)    ((0x0000AAA0U >> ((PTE) & 0x1F)) & 1)\r
+#define PTE_UW(PTE)    ((0x00008880U >> ((PTE) & 0x1F)) & 1)\r
+#define PTE_UX(PTE)    ((0x0000A0A0U >> ((PTE) & 0x1F)) & 1)\r
+#define PTE_SR(PTE)    ((0xAAAAAAA0U >> ((PTE) & 0x1F)) & 1)\r
+#define PTE_SW(PTE)    ((0x88888880U >> ((PTE) & 0x1F)) & 1)\r
+#define PTE_SX(PTE)    ((0xA0A0A000U >> ((PTE) & 0x1F)) & 1)\r
+\r
+#define PTE_CHECK_PERM(PTE, SUPERVISOR, STORE, FETCH) \\r
+  ((STORE) ? ((SUPERVISOR) ? PTE_SW(PTE) : PTE_UW(PTE)) : \\r
+   (FETCH) ? ((SUPERVISOR) ? PTE_SX(PTE) : PTE_UX(PTE)) : \\r
+             ((SUPERVISOR) ? PTE_SR(PTE) : PTE_UR(PTE)))\r
+\r
+#ifdef __riscv\r
+\r
+#if __riscv_xlen == 64\r
+# define MSTATUS_SD             MSTATUS64_SD\r
+# define SSTATUS_SD             SSTATUS64_SD\r
+# define MCAUSE_INT             MCAUSE64_INT\r
+# define MCAUSE_CAUSE           MCAUSE64_CAUSE\r
+# define RISCV_PGLEVEL_BITS     9\r
+#else\r
+# define MSTATUS_SD             MSTATUS32_SD\r
+# define SSTATUS_SD             SSTATUS32_SD\r
+# define RISCV_PGLEVEL_BITS     10\r
+# define MCAUSE_INT             MCAUSE32_INT\r
+# define MCAUSE_CAUSE           MCAUSE32_CAUSE\r
+#endif\r
+\r
+#define RISCV_PGSHIFT           12\r
+#define RISCV_PGSIZE            (1 << RISCV_PGSHIFT)\r
+\r
+#ifndef __ASSEMBLER__\r
+\r
+#ifdef __GNUC__\r
+\r
+#define read_csr(reg) ({ unsigned long __tmp; \\r
+  asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \\r
+  __tmp; })\r
+\r
+#define write_csr(reg, val) ({ \\r
+  if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \\r
+    asm volatile ("csrw " #reg ", %0" :: "i"(val)); \\r
+  else \\r
+    asm volatile ("csrw " #reg ", %0" :: "r"(val)); })\r
+\r
+#define swap_csr(reg, val) ({ unsigned long __tmp; \\r
+  if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \\r
+    asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "i"(val)); \\r
+  else \\r
+    asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "r"(val)); \\r
+  __tmp; })\r
+\r
+#define set_csr(reg, bit) ({ unsigned long __tmp; \\r
+  if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \\r
+    asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \\r
+  else \\r
+    asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \\r
+  __tmp; })\r
+\r
+#define clear_csr(reg, bit) ({ unsigned long __tmp; \\r
+  if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \\r
+    asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \\r
+  else \\r
+    asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \\r
+  __tmp; })\r
+\r
+#define rdtime() read_csr(time)\r
+#define rdcycle() read_csr(cycle)\r
+#define rdinstret() read_csr(instret)\r
+\r
+#ifdef __riscv_atomic\r
+\r
+#define MASK(nr)                    (1UL << nr)\r
+#define MASK_NOT(nr)                (~(1UL << nr))\r
+\r
+/**\r
+ * atomic_read - read atomic variable\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically reads the value of @v.\r
+ */\r
+static inline int atomic_read(const int *v)\r
+{\r
+    return *((volatile int *)(v));\r
+}\r
+\r
+/**\r
+ * atomic_set - set atomic variable\r
+ * @v: pointer of type int\r
+ * @i: required value\r
+ *\r
+ * Atomically sets the value of @v to @i.\r
+ */\r
+static inline void atomic_set(int *v, int i)\r
+{\r
+    *v = i;\r
+}\r
+\r
+/**\r
+ * atomic_add - add integer to atomic variable\r
+ * @i: integer value to add\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically adds @i to @v.\r
+ */\r
+static inline void atomic_add(int i, int *v)\r
+{\r
+    __asm__ __volatile__ (\r
+        "amoadd.w zero, %1, %0"\r
+        : "+A" (*v)\r
+        : "r" (i));\r
+}\r
+\r
+static inline int atomic_fetch_add(unsigned int mask, int *v)\r
+{\r
+    int out;\r
+\r
+    __asm__ __volatile__ (\r
+        "amoadd.w %2, %1, %0"\r
+        : "+A" (*v), "=r" (out)\r
+        : "r" (mask));\r
+    return out;\r
+}\r
+\r
+/**\r
+ * atomic_sub - subtract integer from atomic variable\r
+ * @i: integer value to subtract\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically subtracts @i from @v.\r
+ */\r
+static inline void atomic_sub(int i, int *v)\r
+{\r
+    atomic_add(-i, v);\r
+}\r
+\r
+static inline int atomic_fetch_sub(unsigned int mask, int *v)\r
+{\r
+    int out;\r
+\r
+    __asm__ __volatile__ (\r
+        "amosub.w %2, %1, %0"\r
+        : "+A" (*v), "=r" (out)\r
+        : "r" (mask));\r
+    return out;\r
+}\r
+\r
+/**\r
+ * atomic_add_return - add integer to atomic variable\r
+ * @i: integer value to add\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically adds @i to @v and returns the result\r
+ */\r
+static inline int atomic_add_return(int i, int *v)\r
+{\r
+    register int c;\r
+    __asm__ __volatile__ (\r
+        "amoadd.w %0, %2, %1"\r
+        : "=r" (c), "+A" (*v)\r
+        : "r" (i));\r
+    return (c + i);\r
+}\r
+\r
+/**\r
+ * atomic_sub_return - subtract integer from atomic variable\r
+ * @i: integer value to subtract\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically subtracts @i from @v and returns the result\r
+ */\r
+static inline int atomic_sub_return(int i, int *v)\r
+{\r
+    return atomic_add_return(-i, v);\r
+}\r
+\r
+/**\r
+ * atomic_inc - increment atomic variable\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically increments @v by 1.\r
+ */\r
+static inline void atomic_inc(int *v)\r
+{\r
+    atomic_add(1, v);\r
+}\r
+\r
+/**\r
+ * atomic_dec - decrement atomic variable\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically decrements @v by 1.\r
+ */\r
+static inline void atomic_dec(int *v)\r
+{\r
+    atomic_add(-1, v);\r
+}\r
+\r
+static inline int atomic_inc_return(int *v)\r
+{\r
+    return atomic_add_return(1, v);\r
+}\r
+\r
+static inline int atomic_dec_return(int *v)\r
+{\r
+    return atomic_sub_return(1, v);\r
+}\r
+\r
+/**\r
+ * atomic_sub_and_test - subtract value from variable and test result\r
+ * @i: integer value to subtract\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically subtracts @i from @v and returns\r
+ * true if the result is zero, or false for all\r
+ * other cases.\r
+ */\r
+static inline int atomic_sub_and_test(int i, int *v)\r
+{\r
+    return (atomic_sub_return(i, v) == 0);\r
+}\r
+\r
+/**\r
+ * atomic_inc_and_test - increment and test\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically increments @v by 1\r
+ * and returns true if the result is zero, or false for all\r
+ * other cases.\r
+ */\r
+static inline int atomic_inc_and_test(int *v)\r
+{\r
+    return (atomic_inc_return(v) == 0);\r
+}\r
+\r
+/**\r
+ * atomic_dec_and_test - decrement and test\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically decrements @v by 1 and\r
+ * returns true if the result is 0, or false for all other\r
+ * cases.\r
+ */\r
+static inline int atomic_dec_and_test(int *v)\r
+{\r
+    return (atomic_dec_return(v) == 0);\r
+}\r
+\r
+/**\r
+ * atomic_add_negative - add and test if negative\r
+ * @i: integer value to add\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically adds @i to @v and returns true\r
+ * if the result is negative, or false when\r
+ * result is greater than or equal to zero.\r
+ */\r
+static inline int atomic_add_negative(int i, int *v)\r
+{\r
+    return (atomic_add_return(i, v) < 0);\r
+}\r
+\r
+static inline int atomic_xchg(int *v, int n)\r
+{\r
+    register int c;\r
+    __asm__ __volatile__ (\r
+        "amoswap.w %0, %2, %1"\r
+        : "=r" (c), "+A" (*v)\r
+        : "r" (n));\r
+    return c;\r
+}\r
+\r
+/**\r
+ * atomic_and - Atomically clear bits in atomic variable\r
+ * @mask: Mask of the bits to be retained\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically retains the bits set in @mask from @v\r
+ */\r
+static inline void atomic_and(unsigned int mask, int *v)\r
+{\r
+    __asm__ __volatile__ (\r
+        "amoand.w zero, %1, %0"\r
+        : "+A" (*v)\r
+        : "r" (mask));\r
+}\r
+\r
+static inline int atomic_fetch_and(unsigned int mask, int *v)\r
+{\r
+    int out;\r
+    __asm__ __volatile__ (\r
+        "amoand.w %2, %1, %0"\r
+        : "+A" (*v), "=r" (out)\r
+        : "r" (mask));\r
+    return out;\r
+}\r
+\r
+/**\r
+ * atomic_or - Atomically set bits in atomic variable\r
+ * @mask: Mask of the bits to be set\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically sets the bits set in @mask in @v\r
+ */\r
+static inline void atomic_or(unsigned int mask, int *v)\r
+{\r
+    __asm__ __volatile__ (\r
+        "amoor.w zero, %1, %0"\r
+        : "+A" (*v)\r
+        : "r" (mask));\r
+}\r
+\r
+static inline int atomic_fetch_or(unsigned int mask, int *v)\r
+{\r
+    int out;\r
+    __asm__ __volatile__ (\r
+        "amoor.w %2, %1, %0"\r
+        : "+A" (*v), "=r" (out)\r
+        : "r" (mask));\r
+    return out;\r
+}\r
+\r
+/**\r
+ * atomic_xor - Atomically flips bits in atomic variable\r
+ * @mask: Mask of the bits to be flipped\r
+ * @v: pointer of type int\r
+ *\r
+ * Atomically flips the bits set in @mask in @v\r
+ */\r
+static inline void atomic_xor(unsigned int mask, int *v)\r
+{\r
+    __asm__ __volatile__ (\r
+        "amoxor.w zero, %1, %0"\r
+        : "+A" (*v)\r
+        : "r" (mask));\r
+}\r
+\r
+static inline int atomic_fetch_xor(unsigned int mask, int *v)\r
+{\r
+    int out;\r
+    __asm__ __volatile__ (\r
+        "amoxor.w %2, %1, %0"\r
+        : "+A" (*v), "=r" (out)\r
+        : "r" (mask));\r
+    return out;\r
+}\r
+\r
+/*----------------------------------------------------*/\r
+\r
+/**\r
+ * test_and_set_bit - Set a bit and return its old value\r
+ * @nr: Bit to set\r
+ * @addr: Address to count from\r
+ *\r
+ * This operation is atomic and cannot be reordered.\r
+ * It also implies a memory barrier.\r
+ */\r
+static inline int test_and_set_bit(int nr, volatile unsigned long *addr)\r
+{\r
+    unsigned long __res, __mask;\r
+    __mask = MASK(nr);\r
+    __asm__ __volatile__ (                \\r
+        "amoor.w %0, %2, %1"            \\r
+        : "=r" (__res), "+A" (*addr)    \\r
+        : "r" (__mask));                \\r
+\r
+        return ((__res & __mask) != 0);\r
+}\r
+\r
+\r
+/**\r
+ * test_and_clear_bit - Clear a bit and return its old value\r
+ * @nr: Bit to clear\r
+ * @addr: Address to count from\r
+ *\r
+ * This operation is atomic and cannot be reordered.\r
+ * It also implies a memory barrier.\r
+ */\r
+static inline int test_and_clear_bit(int nr, volatile unsigned long *addr)\r
+{\r
+    unsigned long __res, __mask;\r
+    __mask = MASK_NOT(nr);\r
+    __asm__ __volatile__ (                \\r
+        "amoand.w %0, %2, %1"            \\r
+        : "=r" (__res), "+A" (*addr)    \\r
+        : "r" (__mask));                \\r
+\r
+        return ((__res & __mask) != 0);\r
+}\r
+\r
+/**\r
+ * test_and_change_bit - Change a bit and return its old value\r
+ * @nr: Bit to change\r
+ * @addr: Address to count from\r
+ *\r
+ * This operation is atomic and cannot be reordered.\r
+ * It also implies a memory barrier.\r
+ */\r
+static inline int test_and_change_bit(int nr, volatile unsigned long *addr)\r
+{\r
+\r
+    unsigned long __res, __mask;\r
+    __mask = MASK(nr);\r
+    __asm__ __volatile__ (                \\r
+        "amoxor.w %0, %2, %1"            \\r
+        : "=r" (__res), "+A" (*addr)    \\r
+        : "r" (__mask));                \\r
+\r
+        return ((__res & __mask) != 0);\r
+}\r
+\r
+/**\r
+ * set_bit - Atomically set a bit in memory\r
+ * @nr: the bit to set\r
+ * @addr: the address to start counting from\r
+ *\r
+ * This function is atomic and may not be reordered. \r
+ */\r
+\r
+static inline void set_bit(int nr, volatile unsigned long *addr)\r
+{\r
+    __asm__ __volatile__ (                    \\r
+        "AMOOR.w zero, %1, %0"            \\r
+        : "+A" (*addr)            \\r
+        : "r" (MASK(nr)));\r
+}\r
+\r
+/**\r
+ * clear_bit - Clears a bit in memory\r
+ * @nr: Bit to clear\r
+ * @addr: Address to start counting from\r
+ *\r
+ * clear_bit() is atomic and may not be reordered.  \r
+ */\r
+static inline void clear_bit(int nr, volatile unsigned long *addr)\r
+{\r
+    __asm__ __volatile__ (                    \\r
+        "AMOAND.w zero, %1, %0"            \\r
+        : "+A" (*addr)            \\r
+        : "r" (MASK_NOT(nr)));\r
+}\r
+\r
+/**\r
+ * change_bit - Toggle a bit in memory\r
+ * @nr: Bit to change\r
+ * @addr: Address to start counting from\r
+ *\r
+ * change_bit() is atomic and may not be reordered.\r
+ */\r
+static inline void change_bit(int nr, volatile unsigned long *addr)\r
+{\r
+    __asm__ __volatile__ (                    \\r
+            "AMOXOR.w zero, %1, %0"            \\r
+            : "+A" (*addr)            \\r
+            : "r" (MASK(nr)));\r
+}\r
+\r
+#endif /* __riscv_atomic */\r
+\r
+#endif  /*__GNUC__*/\r
+\r
+#endif  /*__ASSEMBLER__*/\r
+\r
+#endif  /*__riscv*/\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif    /*RISCV_CSR_ENCODING_H*/\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/entry.S b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/entry.S
new file mode 100644 (file)
index 0000000..fce18d7
--- /dev/null
@@ -0,0 +1,162 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
+ *\r
+ * @file entry.S\r
+ * @author Microsemi SoC Products Group\r
+ * @brief Mi-V soft processor vectors, trap handling and startup code.\r
+ *\r
+ * SVN $Revision: 9947 $\r
+ * SVN $Date: 2018-04-30 20:28:49 +0530 (Mon, 30 Apr 2018) $\r
+ */\r
+#ifndef ENTRY_S\r
+#define ENTRY_S\r
+\r
+#include "encoding.h"\r
+\r
+#if __riscv_xlen == 64\r
+# define LREG ld\r
+# define SREG sd\r
+# define REGBYTES 8\r
+#else\r
+# define LREG lw\r
+# define SREG sw\r
+# define REGBYTES 4\r
+#endif\r
+\r
+  .section      .text.entry\r
+  .extern vFreeRTOSPortTrapHandler\r
+  .globl _start\r
+\r
+_start:\r
+  j handle_reset\r
+\r
+nmi_vector:\r
+  j nmi_vector\r
+\r
+trap_vector:\r
+  j vFreeRTOSPortTrapHandler\r
+\r
+handle_reset:\r
+  la t0, vFreeRTOSPortTrapHandler\r
+  csrw mtvec, t0\r
+  csrwi mstatus, 0\r
+  csrwi mie, 0\r
+\r
+/*Floating point support configuration*/\r
+\r
+#ifdef __riscv_flen\r
+  csrr t0, mstatus\r
+  lui t1, 0xffffa\r
+  addi t1, t1, -1\r
+  and t0, t0, t1\r
+  lui t1, 0x4\r
+  or t1, t0, t1\r
+  csrw mstatus, t1\r
+\r
+  lui t0, 0x0\r
+  fscsr t0\r
+#endif\r
+.option push\r
+\r
+# Ensure the instruction is not optimized, since gp is not yet set\r
+\r
+.option norelax\r
+  # initialize global pointer\r
+  la gp, __global_pointer$\r
+\r
+.option pop\r
+\r
+  # initialize stack pointer\r
+  la sp, __stack_top\r
+\r
+  # perform the rest of initialization in C\r
+  j _init\r
+\r
+#if 0\r
+trap_entry:\r
+  addi sp, sp, -32*REGBYTES\r
+\r
+  SREG x1, 0 * REGBYTES(sp)\r
+  SREG x2, 1 * REGBYTES(sp)\r
+  SREG x3, 2 * REGBYTES(sp)\r
+  SREG x4, 3 * REGBYTES(sp)\r
+  SREG x5, 4 * REGBYTES(sp)\r
+  SREG x6, 5 * REGBYTES(sp)\r
+  SREG x7, 6 * REGBYTES(sp)\r
+  SREG x8, 7 * REGBYTES(sp)\r
+  SREG x9, 8 * REGBYTES(sp)\r
+  SREG x10, 9 * REGBYTES(sp)\r
+  SREG x11, 10 * REGBYTES(sp)\r
+  SREG x12, 11 * REGBYTES(sp)\r
+  SREG x13, 12 * REGBYTES(sp)\r
+  SREG x14, 13 * REGBYTES(sp)\r
+  SREG x15, 14 * REGBYTES(sp)\r
+  SREG x16, 15 * REGBYTES(sp)\r
+  SREG x17, 16 * REGBYTES(sp)\r
+  SREG x18, 17 * REGBYTES(sp)\r
+  SREG x19, 18 * REGBYTES(sp)\r
+  SREG x20, 19 * REGBYTES(sp)\r
+  SREG x21, 20 * REGBYTES(sp)\r
+  SREG x22, 21 * REGBYTES(sp)\r
+  SREG x23, 22 * REGBYTES(sp)\r
+  SREG x24, 23 * REGBYTES(sp)\r
+  SREG x25, 24 * REGBYTES(sp)\r
+  SREG x26, 25 * REGBYTES(sp)\r
+  SREG x27, 26 * REGBYTES(sp)\r
+  SREG x28, 27 * REGBYTES(sp)\r
+  SREG x29, 28 * REGBYTES(sp)\r
+  SREG x30, 29 * REGBYTES(sp)\r
+  SREG x31, 30 * REGBYTES(sp)\r
+\r
+\r
+  csrr t0, mepc\r
+  SREG t0, 31 * REGBYTES(sp)\r
+\r
+  csrr a0, mcause\r
+  csrr a1, mepc\r
+  mv a2, sp\r
+  jal handle_trap\r
+  csrw mepc, a0\r
+\r
+  # Remain in M-mode after mret\r
+  li t0, MSTATUS_MPP\r
+  csrs mstatus, t0\r
+\r
+  LREG x1, 0 * REGBYTES(sp)\r
+  LREG x2, 1 * REGBYTES(sp)\r
+  LREG x3, 2 * REGBYTES(sp)\r
+  LREG x4, 3 * REGBYTES(sp)\r
+  LREG x5, 4 * REGBYTES(sp)\r
+  LREG x6, 5 * REGBYTES(sp)\r
+  LREG x7, 6 * REGBYTES(sp)\r
+  LREG x8, 7 * REGBYTES(sp)\r
+  LREG x9, 8 * REGBYTES(sp)\r
+  LREG x10, 9 * REGBYTES(sp)\r
+  LREG x11, 10 * REGBYTES(sp)\r
+  LREG x12, 11 * REGBYTES(sp)\r
+  LREG x13, 12 * REGBYTES(sp)\r
+  LREG x14, 13 * REGBYTES(sp)\r
+  LREG x15, 14 * REGBYTES(sp)\r
+  LREG x16, 15 * REGBYTES(sp)\r
+  LREG x17, 16 * REGBYTES(sp)\r
+  LREG x18, 17 * REGBYTES(sp)\r
+  LREG x19, 18 * REGBYTES(sp)\r
+  LREG x20, 19 * REGBYTES(sp)\r
+  LREG x21, 20 * REGBYTES(sp)\r
+  LREG x22, 21 * REGBYTES(sp)\r
+  LREG x23, 22 * REGBYTES(sp)\r
+  LREG x24, 23 * REGBYTES(sp)\r
+  LREG x25, 24 * REGBYTES(sp)\r
+  LREG x26, 25 * REGBYTES(sp)\r
+  LREG x27, 26 * REGBYTES(sp)\r
+  LREG x28, 27 * REGBYTES(sp)\r
+  LREG x29, 28 * REGBYTES(sp)\r
+  LREG x30, 29 * REGBYTES(sp)\r
+  LREG x31, 30 * REGBYTES(sp)\r
+\r
+  addi sp, sp, 32*REGBYTES\r
+  mret\r
+#endif /* 0 */\r
+\r
+#endif\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/init.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/init.c
new file mode 100644 (file)
index 0000000..8c5998f
--- /dev/null
@@ -0,0 +1,80 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
+ *\r
+ * @file init.c\r
+ * @author Microsemi SoC Products Group\r
+ * @brief Mi-V soft processor memory section initializations and start-up code.\r
+ *\r
+ * SVN $Revision: 9661 $\r
+ * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
+ */\r
+\r
+#include <stdlib.h>\r
+#include <stdint.h>\r
+#include <unistd.h>\r
+\r
+#include "encoding.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+extern uint32_t     __sdata_load;\r
+extern uint32_t     __sdata_start;\r
+extern uint32_t     __sdata_end;\r
+\r
+extern uint32_t     __data_load;\r
+extern uint32_t     __data_start;\r
+extern uint32_t     __data_end;\r
+\r
+extern uint32_t     __sbss_start;\r
+extern uint32_t     __sbss_end;\r
+extern uint32_t     __bss_start;\r
+extern uint32_t     __bss_end;\r
+\r
+\r
+static void copy_section(uint32_t * p_load, uint32_t * p_vma, uint32_t * p_vma_end)\r
+{\r
+    while(p_vma <= p_vma_end)\r
+    {\r
+        *p_vma = *p_load;\r
+        ++p_load;\r
+        ++p_vma;\r
+    }\r
+}\r
+\r
+static void zero_section(uint32_t * start, uint32_t * end)\r
+{\r
+    uint32_t * p_zero = start;\r
+    \r
+    while(p_zero <= end)\r
+    {\r
+        *p_zero = 0;\r
+        ++p_zero;\r
+    }\r
+}\r
+\r
+void _init(void)\r
+{\r
+    extern int main(int, char**);\r
+    const char *argv0 = "hello";\r
+    char *argv[] = {(char *)argv0, NULL, NULL};\r
+\r
+    copy_section(&__sdata_load, &__sdata_start, &__sdata_end);\r
+    copy_section(&__data_load, &__data_start, &__data_end);\r
+    zero_section(&__sbss_start, &__sbss_end);\r
+    zero_section(&__bss_start, &__bss_end);\r
+    \r
+    main(1, argv);\r
+}\r
+\r
+/* Function called after main() finishes */\r
+void\r
+_fini()\r
+{\r
+}\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-igloo2.ld b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-igloo2.ld
new file mode 100644 (file)
index 0000000..68d030d
--- /dev/null
@@ -0,0 +1,139 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
+ *\r
+ * file name : microsemi-riscv-igloo2.ld\r
+ * Mi-V soft processor linker script for creating a SoftConsole downloadable\r
+ * image executing in eNVM.\r
+ *\r
+ * This linker script assumes that the eNVM is connected at on the Mi-V soft\r
+ * processor memory space.\r
+ *\r
+ * SVN $Revision: 9661 $\r
+ * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
+ */\r
+\r
+OUTPUT_ARCH( "riscv" )\r
+ENTRY(_start)\r
+\r
+\r
+MEMORY\r
+{\r
+    envm (rx) : ORIGIN = 0x60000000, LENGTH = 240k\r
+    ram (rwx) : ORIGIN = 0x80000000, LENGTH = 64k\r
+}\r
+\r
+RAM_START_ADDRESS   = 0x80000000;       /* Must be the same value MEMORY region ram ORIGIN above. */\r
+RAM_SIZE            = 64k;              /* Must be the same value MEMORY region ram LENGTH above. */\r
+STACK_SIZE          = 2k;               /* needs to be calculated for your application */\r
+HEAP_SIZE           = 2k;               /* needs to be calculated for your application */\r
+\r
+SECTIONS\r
+{\r
+  .text : ALIGN(0x10)\r
+  {\r
+    KEEP (*(SORT_NONE(.text.entry)))\r
+    . = ALIGN(0x10);\r
+    *(.text .text.* .gnu.linkonce.t.*)\r
+    *(.plt)\r
+    . = ALIGN(0x10);\r
+\r
+    KEEP (*crtbegin.o(.ctors))\r
+    KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\r
+    KEEP (*(SORT(.ctors.*)))\r
+    KEEP (*crtend.o(.ctors))\r
+    KEEP (*crtbegin.o(.dtors))\r
+    KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\r
+    KEEP (*(SORT(.dtors.*)))\r
+    KEEP (*crtend.o(.dtors))\r
+\r
+    *(.rodata .rodata.* .gnu.linkonce.r.*)\r
+    *(.gcc_except_table)\r
+    *(.eh_frame_hdr)\r
+    *(.eh_frame)\r
+\r
+    KEEP (*(.init))\r
+    KEEP (*(.fini))\r
+\r
+    PROVIDE_HIDDEN (__preinit_array_start = .);\r
+    KEEP (*(.preinit_array))\r
+    PROVIDE_HIDDEN (__preinit_array_end = .);\r
+    PROVIDE_HIDDEN (__init_array_start = .);\r
+    KEEP (*(SORT(.init_array.*)))\r
+    KEEP (*(.init_array))\r
+    PROVIDE_HIDDEN (__init_array_end = .);\r
+    PROVIDE_HIDDEN (__fini_array_start = .);\r
+    KEEP (*(.fini_array))\r
+    KEEP (*(SORT(.fini_array.*)))\r
+    PROVIDE_HIDDEN (__fini_array_end = .);\r
+    . = ALIGN(0x10);\r
+\r
+  } >envm\r
+\r
+  /* short/global data section */\r
+  .sdata : ALIGN(0x10)\r
+  {\r
+    __sdata_load = LOADADDR(.sdata);\r
+    __sdata_start = .;\r
+    PROVIDE( __global_pointer$ = . + 0x800);\r
+    *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2)\r
+    *(.srodata*)\r
+    *(.sdata .sdata.* .gnu.linkonce.s.*)\r
+    . = ALIGN(0x10);\r
+    __sdata_end = .;\r
+  } >ram AT>envm\r
+\r
+  /* data section */\r
+  .data : ALIGN(0x10)\r
+  {\r
+    __data_load = LOADADDR(.data);\r
+    __data_start = .;\r
+    *(.got.plt) *(.got)\r
+    *(.shdata)\r
+    *(.data .data.* .gnu.linkonce.d.*)\r
+    . = ALIGN(0x10);\r
+    __data_end = .;\r
+  } >ram AT>envm\r
+\r
+  /* sbss section */\r
+  .sbss : ALIGN(0x10)\r
+  {\r
+    __sbss_start = .;\r
+    *(.sbss .sbss.* .gnu.linkonce.sb.*)\r
+    *(.scommon)\r
+    . = ALIGN(0x10);\r
+    __sbss_end = .;\r
+  } > ram\r
+\r
+  /* sbss section */\r
+  .bss : ALIGN(0x10)\r
+  {\r
+    __bss_start = .;\r
+    *(.shbss)\r
+    *(.bss .bss.* .gnu.linkonce.b.*)\r
+    *(COMMON)\r
+    . = ALIGN(0x10);\r
+    __bss_end = .;\r
+  } > ram\r
+\r
+  /* End of uninitialized data segment */\r
+  _end = .;\r
+\r
+  .heap : ALIGN(0x10)\r
+  {\r
+    __heap_start = .;\r
+    . += HEAP_SIZE;\r
+    __heap_end = .;\r
+    . = ALIGN(0x10);\r
+    _heap_end = __heap_end;\r
+  } > ram\r
+\r
+  .stack : ALIGN(0x10)\r
+  {\r
+    __stack_bottom = .;\r
+    . += STACK_SIZE;\r
+    __stack_top = .;\r
+    _sp = .;\r
+       __freertos_irq_stack_top = .;\r
+  } > ram\r
+}\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-ram.ld b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-ram.ld
new file mode 100644 (file)
index 0000000..6b08b83
--- /dev/null
@@ -0,0 +1,139 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
+ *\r
+ * file name : microsemi-riscv-ram.ld\r
+ * Mi-V soft processor linker script for creating a SoftConsole downloadable\r
+ * debug image executing in SRAM.\r
+ *\r
+ * This linker script assumes that the SRAM is connected at on the Mi-V soft\r
+ * processor memory space. The start address and size of the memory space must\r
+ * be correct as per the Libero design.\r
+ *\r
+ * SVN $Revision: 9661 $\r
+ * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
+ */\r
+\r
+OUTPUT_ARCH( "riscv" )\r
+ENTRY(_start)\r
+\r
+\r
+MEMORY\r
+{\r
+    ram (rwx) : ORIGIN = 0x80000000, LENGTH = 512k\r
+}\r
+\r
+RAM_START_ADDRESS   = 0x80000000;       /* Must be the same value MEMORY region ram ORIGIN above. */\r
+RAM_SIZE            = 512k;              /* Must be the same value MEMORY region ram LENGTH above. */\r
+STACK_SIZE          = 2k;               /* needs to be calculated for your application */\r
+HEAP_SIZE           = 4;               /* needs to be calculated for your application */\r
+\r
+SECTIONS\r
+{\r
+  .text : ALIGN(0x10)\r
+  {\r
+    KEEP (*(SORT_NONE(.text.entry)))\r
+    . = ALIGN(0x10);\r
+    *(.text .text.* .gnu.linkonce.t.*)\r
+    *(.plt)\r
+    . = ALIGN(0x10);\r
+\r
+    KEEP (*crtbegin.o(.ctors))\r
+    KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\r
+    KEEP (*(SORT(.ctors.*)))\r
+    KEEP (*crtend.o(.ctors))\r
+    KEEP (*crtbegin.o(.dtors))\r
+    KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\r
+    KEEP (*(SORT(.dtors.*)))\r
+    KEEP (*crtend.o(.dtors))\r
+\r
+    *(.rodata .rodata.* .gnu.linkonce.r.*)\r
+    *(.gcc_except_table)\r
+    *(.eh_frame_hdr)\r
+    *(.eh_frame)\r
+\r
+    KEEP (*(.init))\r
+    KEEP (*(.fini))\r
+\r
+    PROVIDE_HIDDEN (__preinit_array_start = .);\r
+    KEEP (*(.preinit_array))\r
+    PROVIDE_HIDDEN (__preinit_array_end = .);\r
+    PROVIDE_HIDDEN (__init_array_start = .);\r
+    KEEP (*(SORT(.init_array.*)))\r
+    KEEP (*(.init_array))\r
+    PROVIDE_HIDDEN (__init_array_end = .);\r
+    PROVIDE_HIDDEN (__fini_array_start = .);\r
+    KEEP (*(.fini_array))\r
+    KEEP (*(SORT(.fini_array.*)))\r
+    PROVIDE_HIDDEN (__fini_array_end = .);\r
+    . = ALIGN(0x10);\r
+\r
+  } > ram\r
+\r
+  /* short/global data section */\r
+  .sdata : ALIGN(0x10)\r
+  {\r
+    __sdata_load = LOADADDR(.sdata);\r
+    __sdata_start = .;\r
+    PROVIDE( __global_pointer$ = . + 0x800);\r
+    *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2)\r
+    *(.srodata*)\r
+    *(.sdata .sdata.* .gnu.linkonce.s.*)\r
+    . = ALIGN(0x10);\r
+    __sdata_end = .;\r
+  } > ram\r
+\r
+  /* data section */\r
+  .data : ALIGN(0x10)\r
+  {\r
+    __data_load = LOADADDR(.data);\r
+    __data_start = .;\r
+    *(.got.plt) *(.got)\r
+    *(.shdata)\r
+    *(.data .data.* .gnu.linkonce.d.*)\r
+    . = ALIGN(0x10);\r
+    __data_end = .;\r
+  } > ram\r
+\r
+  /* sbss section */\r
+  .sbss : ALIGN(0x10)\r
+  {\r
+    __sbss_start = .;\r
+    *(.sbss .sbss.* .gnu.linkonce.sb.*)\r
+    *(.scommon)\r
+    . = ALIGN(0x10);\r
+    __sbss_end = .;\r
+  } > ram\r
+\r
+  /* sbss section */\r
+  .bss : ALIGN(0x10)\r
+  {\r
+    __bss_start = .;\r
+    *(.shbss)\r
+    *(.bss .bss.* .gnu.linkonce.b.*)\r
+    *(COMMON)\r
+    . = ALIGN(0x10);\r
+    __bss_end = .;\r
+  } > ram\r
+\r
+  /* End of uninitialized data segment */\r
+  _end = .;\r
+\r
+  .heap : ALIGN(0x10)\r
+  {\r
+    __heap_start = .;\r
+    . += HEAP_SIZE;\r
+    __heap_end = .;\r
+    . = ALIGN(0x10);\r
+    _heap_end = __heap_end;\r
+  } > ram\r
+\r
+  .stack : ALIGN(0x10)\r
+  {\r
+    __stack_bottom = .;\r
+    . += STACK_SIZE;\r
+    __stack_top = .;\r
+    _sp = .;\r
+       __freertos_irq_stack_top = .;\r
+  } > ram\r
+}\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.c
new file mode 100644 (file)
index 0000000..14ecf7b
--- /dev/null
@@ -0,0 +1,130 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2018 Microsemi SoC Products Group. All rights reserved.\r
+ *\r
+ * @file riscv_hal.c\r
+ * @author Microsemi SoC Products Group\r
+ * @brief Implementation of Hardware Abstraction Layer for Mi-V soft processors\r
+ *\r
+ * SVN $Revision: 9835 $\r
+ * SVN $Date: 2018-03-19 19:11:35 +0530 (Mon, 19 Mar 2018) $\r
+ */\r
+#include <stdlib.h>\r
+#include <stdint.h>\r
+#include <unistd.h>\r
+\r
+#include "riscv_hal.h"\r
+\r
+#include "FreeRTOS.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#define RTC_PRESCALER 100UL\r
+\r
+#define SUCCESS 0U\r
+#define ERROR   1U\r
+\r
+/*------------------------------------------------------------------------------\r
+ *\r
+ */\r
+uint8_t Invalid_IRQHandler(void);\r
+uint8_t External_1_IRQHandler(void);\r
+uint8_t External_2_IRQHandler(void);\r
+uint8_t External_3_IRQHandler(void);\r
+uint8_t External_4_IRQHandler(void);\r
+uint8_t External_5_IRQHandler(void);\r
+uint8_t External_6_IRQHandler(void);\r
+uint8_t External_7_IRQHandler(void);\r
+uint8_t External_8_IRQHandler(void);\r
+uint8_t External_9_IRQHandler(void);\r
+uint8_t External_10_IRQHandler(void);\r
+uint8_t External_11_IRQHandler(void);\r
+uint8_t External_12_IRQHandler(void);\r
+uint8_t External_13_IRQHandler(void);\r
+uint8_t External_14_IRQHandler(void);\r
+uint8_t External_15_IRQHandler(void);\r
+uint8_t External_16_IRQHandler(void);\r
+uint8_t External_17_IRQHandler(void);\r
+uint8_t External_18_IRQHandler(void);\r
+uint8_t External_19_IRQHandler(void);\r
+uint8_t External_20_IRQHandler(void);\r
+uint8_t External_21_IRQHandler(void);\r
+uint8_t External_22_IRQHandler(void);\r
+uint8_t External_23_IRQHandler(void);\r
+uint8_t External_24_IRQHandler(void);\r
+uint8_t External_25_IRQHandler(void);\r
+uint8_t External_26_IRQHandler(void);\r
+uint8_t External_27_IRQHandler(void);\r
+uint8_t External_28_IRQHandler(void);\r
+uint8_t External_29_IRQHandler(void);\r
+uint8_t External_30_IRQHandler(void);\r
+uint8_t External_31_IRQHandler(void);\r
+\r
+/*------------------------------------------------------------------------------\r
+ *\r
+ */\r
+extern void Software_IRQHandler(void);\r
+extern void Timer_IRQHandle( void );\r
+\r
+/*------------------------------------------------------------------------------\r
+ * RISC-V interrupt handler for external interrupts.\r
+ */\r
+uint8_t (*ext_irq_handler_table[32])(void) =\r
+{\r
+    Invalid_IRQHandler,\r
+    External_1_IRQHandler,\r
+    External_2_IRQHandler,\r
+    External_3_IRQHandler,\r
+    External_4_IRQHandler,\r
+    External_5_IRQHandler,\r
+    External_6_IRQHandler,\r
+    External_7_IRQHandler,\r
+    External_8_IRQHandler,\r
+    External_9_IRQHandler,\r
+    External_10_IRQHandler,\r
+    External_11_IRQHandler,\r
+    External_12_IRQHandler,\r
+    External_13_IRQHandler,\r
+    External_14_IRQHandler,\r
+    External_15_IRQHandler,\r
+    External_16_IRQHandler,\r
+    External_17_IRQHandler,\r
+    External_18_IRQHandler,\r
+    External_19_IRQHandler,\r
+    External_20_IRQHandler,\r
+    External_21_IRQHandler,\r
+    External_22_IRQHandler,\r
+    External_23_IRQHandler,\r
+    External_24_IRQHandler,\r
+    External_25_IRQHandler,\r
+    External_26_IRQHandler,\r
+    External_27_IRQHandler,\r
+    External_28_IRQHandler,\r
+    External_29_IRQHandler,\r
+    External_30_IRQHandler,\r
+    External_31_IRQHandler\r
+};\r
+\r
+/*------------------------------------------------------------------------------\r
+ *\r
+ */\r
+void handle_m_ext_interrupt(void)\r
+{\r
+    uint32_t int_num  = PLIC_ClaimIRQ();\r
+    uint8_t disable = EXT_IRQ_KEEP_ENABLED;\r
+\r
+    disable = ext_irq_handler_table[int_num]();\r
+\r
+    PLIC_CompleteIRQ(int_num);\r
+\r
+    if(EXT_IRQ_DISABLE == disable)\r
+    {\r
+        PLIC_DisableIRQ((IRQn_Type)int_num);\r
+    }\r
+}\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.h
new file mode 100644 (file)
index 0000000..7c3835f
--- /dev/null
@@ -0,0 +1,55 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2018 Microsemi SoC Products Group. All rights reserved.\r
+ *\r
+ * @file riscv_hal.h\r
+ * @author Microsemi SoC Products Group\r
+ * @brief Hardware Abstraction Layer functions for Mi-V soft processors\r
+ *\r
+ * SVN $Revision: 9835 $\r
+ * SVN $Date: 2018-03-19 19:11:35 +0530 (Mon, 19 Mar 2018) $\r
+ */\r
+\r
+#ifndef RISCV_HAL_H\r
+#define RISCV_HAL_H\r
+\r
+#include "riscv_plic.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/*\r
+ *Return value from External IRQ handler. This will be used to disable the External\r
+ *interrupt.\r
+ */\r
+#define EXT_IRQ_KEEP_ENABLED                0U\r
+#define EXT_IRQ_DISABLE                     1U\r
+\r
+/*------------------------------------------------------------------------------\r
+ * Interrupt enable/disable.\r
+ */\r
+void __disable_irq(void);\r
+void __enable_irq(void);\r
+\r
+/*------------------------------------------------------------------------------\r
+ *  System tick handler. This is generated from the RISC-V machine timer.\r
+ */\r
+void SysTick_Handler(void);\r
+\r
+/*------------------------------------------------------------------------------\r
+ * System tick configuration.\r
+ * Configures the machine timer to generate a system tick interrupt at regular\r
+ * intervals.\r
+ * Takes the number of system clock ticks between interrupts.\r
+ *\r
+ * Returns 0 if successful.\r
+ * Returns 1 if the interrupt interval cannot be achieved.\r
+ */\r
+uint32_t SysTick_Config(uint32_t ticks);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif  /* RISCV_HAL_H */\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal_stubs.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal_stubs.c
new file mode 100644 (file)
index 0000000..29a4f40
--- /dev/null
@@ -0,0 +1,227 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2018 Microsemi SoC Products Group. All rights reserved.\r
+ *\r
+ * @file riscv_hal_stubs.c\r
+ * @author Microsemi SoC Products Group\r
+ * @brief Mi-V soft processor Interrupt Function stubs.\r
+ * The functions below will only be linked with the application code if the user\r
+ * does not provide an implementation for these functions. These functions are\r
+ * defined with weak linking so that they can be overridden by a function with\r
+ * same prototype in the user's application code.\r
+ *\r
+ * SVN $Revision: 9835 $\r
+ * SVN $Date: 2018-03-19 19:11:35 +0530 (Mon, 19 Mar 2018) $\r
+ */\r
+#include <unistd.h>\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) void Software_IRQHandler(void)\r
+{\r
+    _exit(10);\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) void SysTick_Handler(void)\r
+{\r
+       /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t Invalid_IRQHandler(void)\r
+{\r
+    return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_1_IRQHandler(void)\r
+{\r
+    return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_2_IRQHandler(void)\r
+{\r
+    return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_3_IRQHandler(void)\r
+{\r
+    return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_4_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_5_IRQHandler(void)\r
+{\r
+    return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_6_IRQHandler(void)\r
+{\r
+    return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_7_IRQHandler(void)\r
+{\r
+    return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_8_IRQHandler(void)\r
+{\r
+    return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_9_IRQHandler(void)\r
+{\r
+    return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_10_IRQHandler(void)\r
+{\r
+    return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_11_IRQHandler(void)\r
+{\r
+    return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_12_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_13_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_14_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_15_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_16_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_17_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_18_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_19_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_20_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_21_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_22_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_23_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_24_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_25_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_26_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_27_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_28_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_29_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provided*/\r
+__attribute__((weak)) uint8_t External_30_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+/*Weakly linked handler. Will be replaced with user's definition if provide*/\r
+__attribute__((weak)) uint8_t External_31_IRQHandler(void)\r
+{\r
+       return(0U); /*Default handler*/\r
+}\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/riscv_plic.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/riscv_plic.h
new file mode 100644 (file)
index 0000000..2d09518
--- /dev/null
@@ -0,0 +1,249 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
+ *\r
+ * @file riscv_plic.h\r
+ * @author Microsemi SoC Products Group\r
+ * @brief Mi-V soft processor PLIC and PRCI access data structures and functions.\r
+ *\r
+ * SVN $Revision: 9838 $\r
+ * SVN $Date: 2018-03-19 19:22:54 +0530 (Mon, 19 Mar 2018) $\r
+ */\r
+#ifndef RISCV_PLIC_H\r
+#define RISCV_PLIC_H\r
+\r
+#include <stdint.h>\r
+\r
+#include "encoding.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#define PLIC_NUM_SOURCES 31\r
+#define PLIC_NUM_PRIORITIES 0\r
+\r
+/*==============================================================================\r
+ * Interrupt numbers:\r
+ */\r
+typedef enum\r
+{\r
+    NoInterrupt_IRQn = 0,\r
+    External_1_IRQn  = 1,\r
+    External_2_IRQn  = 2,\r
+    External_3_IRQn  = 3, \r
+    External_4_IRQn  = 4,\r
+    External_5_IRQn  = 5,\r
+    External_6_IRQn  = 6,\r
+    External_7_IRQn  = 7,\r
+    External_8_IRQn  = 8,\r
+    External_9_IRQn  = 9,\r
+    External_10_IRQn = 10,\r
+    External_11_IRQn = 11,\r
+    External_12_IRQn = 12,\r
+    External_13_IRQn = 13,\r
+    External_14_IRQn = 14,\r
+    External_15_IRQn = 15,\r
+    External_16_IRQn = 16,\r
+    External_17_IRQn = 17,\r
+    External_18_IRQn = 18,\r
+    External_19_IRQn = 19,\r
+    External_20_IRQn = 20,\r
+    External_21_IRQn = 21,\r
+    External_22_IRQn = 22,\r
+    External_23_IRQn = 23,\r
+    External_24_IRQn = 24,\r
+    External_25_IRQn = 25,\r
+    External_26_IRQn = 26,\r
+    External_27_IRQn = 27,\r
+    External_28_IRQn = 28,\r
+    External_29_IRQn = 29,\r
+    External_30_IRQn = 30,\r
+    External_31_IRQn = 31\r
+} IRQn_Type;\r
+\r
+\r
+/*==============================================================================\r
+ * PLIC: Platform Level Interrupt Controller\r
+ */\r
+#define PLIC_BASE_ADDR 0x40000000UL\r
+\r
+typedef struct\r
+{\r
+    volatile uint32_t PRIORITY_THRESHOLD;\r
+    volatile uint32_t CLAIM_COMPLETE;\r
+    volatile uint32_t reserved[1022];\r
+} IRQ_Target_Type;\r
+\r
+typedef struct\r
+{\r
+    volatile uint32_t ENABLES[32];\r
+} Target_Enables_Type;\r
+\r
+typedef struct\r
+{\r
+    /*-------------------- Source Priority --------------------*/\r
+    volatile uint32_t SOURCE_PRIORITY[1024];\r
+    \r
+    /*-------------------- Pending array --------------------*/\r
+    volatile const uint32_t PENDING_ARRAY[32];\r
+    volatile uint32_t RESERVED1[992];\r
+    \r
+    /*-------------------- Target enables --------------------*/\r
+    volatile Target_Enables_Type TARGET_ENABLES[15808];\r
+\r
+    volatile uint32_t RESERVED2[16384];\r
+    \r
+    /*--- Target Priority threshold and claim/complete---------*/\r
+    IRQ_Target_Type TARGET[15872];\r
+    \r
+} PLIC_Type;\r
+\r
+\r
+#define PLIC    ((PLIC_Type *)PLIC_BASE_ADDR)\r
+\r
+/*==============================================================================\r
+ * PRCI: Power, Reset, Clock, Interrupt\r
+ */\r
+#define PRCI_BASE   0x44000000UL\r
+\r
+typedef struct\r
+{\r
+    volatile uint32_t MSIP[4095];\r
+    volatile uint32_t reserved;\r
+    volatile uint64_t MTIMECMP[4095];\r
+    volatile const uint64_t MTIME;\r
+} PRCI_Type;\r
+\r
+#define PRCI    ((PRCI_Type *)PRCI_BASE) \r
+\r
+/*==============================================================================\r
+ * The function PLIC_init() initializes the PLIC controller and enables the \r
+ * global external interrupt bit.\r
+ */\r
+static inline void PLIC_init(void)\r
+{\r
+    uint32_t inc;\r
+    unsigned long hart_id = read_csr(mhartid);\r
+\r
+    /* Disable all interrupts for the current hart. */\r
+    for(inc = 0; inc < ((PLIC_NUM_SOURCES + 32u) / 32u); ++inc)\r
+    {\r
+        PLIC->TARGET_ENABLES[hart_id].ENABLES[inc] = 0;\r
+    }\r
+\r
+    /* Set priorities to zero. */\r
+    /* Should this really be done??? Calling PLIC_init() on one hart will cause\r
+    * the priorities previously set by other harts to be messed up. */\r
+    for(inc = 0; inc < PLIC_NUM_SOURCES; ++inc)\r
+    {\r
+        PLIC->SOURCE_PRIORITY[inc] = 0;\r
+    }\r
+\r
+    /* Set the threshold to zero. */\r
+    PLIC->TARGET[hart_id].PRIORITY_THRESHOLD = 0;\r
+\r
+    /* Enable machine external interrupts. */\r
+    set_csr(mie, MIP_MEIP);\r
+}\r
+\r
+/*==============================================================================\r
+ * The function PLIC_EnableIRQ() enables the external interrupt for the interrupt\r
+ * number indicated by the parameter IRQn.\r
+ */\r
+static inline void PLIC_EnableIRQ(IRQn_Type IRQn)\r
+{\r
+    unsigned long hart_id = read_csr(mhartid);\r
+    uint32_t current = PLIC->TARGET_ENABLES[hart_id].ENABLES[IRQn / 32];\r
+    current |= (uint32_t)1 << (IRQn % 32);\r
+    PLIC->TARGET_ENABLES[hart_id].ENABLES[IRQn / 32] = current;\r
+}\r
+\r
+/*==============================================================================\r
+ * The function PLIC_DisableIRQ() disables the external interrupt for the interrupt\r
+ * number indicated by the parameter IRQn.\r
+\r
+ * NOTE:\r
+ *     This function can be used to disable the external interrupt from outside\r
+ *     external interrupt handler function.\r
+ *     This function MUST NOT be used from within the External Interrupt handler.\r
+ *     If you wish to disable the external interrupt while the interrupt handler\r
+ *     for that external interrupt is executing then you must use the return value\r
+ *     EXT_IRQ_DISABLE to return from the extern interrupt handler.\r
+ */\r
+static inline void PLIC_DisableIRQ(IRQn_Type IRQn)\r
+{\r
+    unsigned long hart_id = read_csr(mhartid);\r
+    uint32_t current = PLIC->TARGET_ENABLES[hart_id].ENABLES[IRQn / 32];\r
+\r
+    current &= ~((uint32_t)1 << (IRQn % 32));\r
+\r
+    PLIC->TARGET_ENABLES[hart_id].ENABLES[IRQn / 32] = current;\r
+}\r
+\r
+/*==============================================================================\r
+ * The function PLIC_SetPriority() sets the priority for the external interrupt \r
+ * for the interrupt number indicated by the parameter IRQn.\r
+ */\r
+static inline void PLIC_SetPriority(IRQn_Type IRQn, uint32_t priority) \r
+{\r
+    PLIC->SOURCE_PRIORITY[IRQn] = priority;\r
+}\r
+\r
+/*==============================================================================\r
+ * The function PLIC_GetPriority() returns the priority for the external interrupt \r
+ * for the interrupt number indicated by the parameter IRQn.\r
+ */\r
+static inline uint32_t PLIC_GetPriority(IRQn_Type IRQn)\r
+{\r
+    return PLIC->SOURCE_PRIORITY[IRQn];\r
+}\r
+\r
+/*==============================================================================\r
+ * The function PLIC_ClaimIRQ() claims the interrupt from the PLIC controller.\r
+ */\r
+static inline uint32_t PLIC_ClaimIRQ(void)\r
+{\r
+    unsigned long hart_id = read_csr(mhartid);\r
+\r
+    return PLIC->TARGET[hart_id].CLAIM_COMPLETE;\r
+}\r
+\r
+/*==============================================================================\r
+ * The function PLIC_CompleteIRQ() indicates to the PLIC controller the interrupt\r
+ * is processed and claim is complete.\r
+ */\r
+static inline void PLIC_CompleteIRQ(uint32_t source)\r
+{\r
+    unsigned long hart_id = read_csr(mhartid);\r
+\r
+    PLIC->TARGET[hart_id].CLAIM_COMPLETE = source;\r
+}\r
+\r
+/*==============================================================================\r
+ * The function raise_soft_interrupt() raises a synchronous software interrupt by\r
+ * writing into the MSIP register.\r
+ */\r
+static inline void raise_soft_interrupt()\r
+{\r
+    unsigned long hart_id = read_csr(mhartid);\r
+\r
+    /*You need to make sure that the global interrupt is enabled*/\r
+    set_csr(mie, MIP_MSIP);       /*Enable software interrupt bit */\r
+    PRCI->MSIP[hart_id] = 0x01;   /*raise soft interrupt for hart0*/\r
+}\r
+\r
+/*==============================================================================\r
+ * The function clear_soft_interrupt() clears a synchronous software interrupt by\r
+ * clearing the MSIP register.\r
+ */\r
+static inline void clear_soft_interrupt()\r
+{\r
+    unsigned long hart_id = read_csr(mhartid);\r
+    PRCI->MSIP[hart_id] = 0x00;   /*clear soft interrupt for hart0*/\r
+}\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif  /* RISCV_PLIC_H */\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/sample_hw_platform.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/sample_hw_platform.h
new file mode 100644 (file)
index 0000000..d0604a1
--- /dev/null
@@ -0,0 +1,121 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2018 Microsemi Corporation.  All rights reserved.\r
+ *\r
+ * Platform definitions\r
+ * Version based on requirements of RISCV-HAL\r
+ *\r
+ * SVN $Revision: 9946 $\r
+ * SVN $Date: 2018-04-30 20:26:55 +0530 (Mon, 30 Apr 2018) $\r
+ */\r
+ /*=========================================================================*//**\r
+  @mainpage Sample file detailing how hw_platform.h should be constructed for \r
+    the Mi-V processors.\r
+\r
+    @section intro_sec Introduction\r
+    The hw_platform.h is to be located in the project root directory.\r
+    Currently this file must be hand crafted when using the Mi-V Soft Processor.\r
+    \r
+    You can use this file as sample.\r
+    Rename this file from sample_hw_platform.h to hw_platform.h and store it in\r
+    the root folder of your project. Then customize it per your HW design.\r
+\r
+    @section driver_configuration Project configuration Instructions\r
+    1. Change SYS_CLK_FREQ define to frequency of Mi-V Soft processor clock\r
+    2  Add all other core BASE addresses\r
+    3. Add peripheral Core Interrupt to Mi-V Soft processor interrupt mappings\r
+    4. Define MSCC_STDIO_UART_BASE_ADDR if you want a CoreUARTapb mapped to STDIO\r
+*//*=========================================================================*/\r
+\r
+#ifndef HW_PLATFORM_H\r
+#define HW_PLATFORM_H\r
+\r
+/***************************************************************************//**\r
+ * Soft-processor clock definition\r
+ * This is the only clock brought over from the Mi-V Soft processor Libero design.\r
+ */\r
+#ifndef SYS_CLK_FREQ\r
+#define SYS_CLK_FREQ                    83000000UL\r
+#endif\r
+\r
+\r
+/***************************************************************************//**\r
+ * Non-memory Peripheral base addresses\r
+ * Format of define is:\r
+ * <corename>_<instance>_BASE_ADDR\r
+ */\r
+#define COREUARTAPB0_BASE_ADDR          0x70001000UL\r
+#define COREGPIO_BASE_ADDR              0x70002000UL\r
+#define COREGPIO_IN_BASE_ADDR           0x70002000UL\r
+#define CORETIMER0_BASE_ADDR            0x70003000UL\r
+#define CORETIMER1_BASE_ADDR            0x70004000UL\r
+#define COREGPIO_OUT_BASE_ADDR          0x70005000UL\r
+#define FLASH_CORE_SPI_BASE             0x70006000UL\r
+#define CORE16550_BASE_ADDR             0x70007000UL\r
+\r
+/***************************************************************************//**\r
+ * Peripheral Interrupts are mapped to the corresponding Mi-V Soft processor\r
+ * interrupt from the Libero design.\r
+ * There can be up to 31 external interrupts (IRQ[30:0] pins) on the Mi-V Soft\r
+ * processor.The Mi-V Soft processor external interrupts are defined in the\r
+ * riscv_plic.h\r
+ * These are of the form\r
+ * typedef enum\r
+{\r
+    NoInterrupt_IRQn = 0,\r
+    External_1_IRQn  = 1,\r
+    External_2_IRQn  = 2,\r
+    .\r
+    .\r
+    .\r
+    External_31_IRQn = 31\r
+} IRQn_Type;\r
\r
+ The interrupt 0 on RISC-V processor is not used. The pin IRQ[0] should map to\r
+ External_1_IRQn likewise IRQ[30] should map to External_31_IRQn\r
+ * Format of define is:\r
+ * <corename>_<instance>_<core interrupt name>\r
+ */\r
+\r
+#define TIMER0_IRQn                     External_30_IRQn\r
+#define TIMER1_IRQn                     External_31_IRQn\r
+\r
+/****************************************************************************\r
+ * Baud value to achieve a 115200 baud rate with a 83MHz system clock.\r
+ * This value is calculated using the following equation:\r
+ *      BAUD_VALUE = (CLOCK / (16 * BAUD_RATE)) - 1\r
+ *****************************************************************************/\r
+#define BAUD_VALUE_115200               (SYS_CLK_FREQ / (16 * 115200)) - 1\r
+\r
+/***************************************************************************//**\r
+ * User edit section- Edit sections below if required\r
+ */\r
+#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
+/*\r
+ * A base address mapping for the STDIO printf/scanf mapping to CortUARTapb\r
+ * must be provided if it is being used\r
+ *\r
+ * e.g. #define MSCC_STDIO_UART_BASE_ADDR COREUARTAPB1_BASE_ADDR\r
+ */\r
+#define MSCC_STDIO_UART_BASE_ADDR COREUARTAPB0_BASE_ADDR\r
+\r
+#ifndef MSCC_STDIO_UART_BASE_ADDR\r
+#error MSCC_STDIO_UART_BASE_ADDR not defined- e.g. #define MSCC_STDIO_UART_BASE_ADDR COREUARTAPB1_BASE_ADDR\r
+#endif\r
+\r
+#ifndef MSCC_STDIO_BAUD_VALUE\r
+/*\r
+ * The MSCC_STDIO_BAUD_VALUE define should be set in your project's settings to\r
+ * specify the baud value used by the standard output CoreUARTapb instance for\r
+ * generating the UART's baud rate if you want a different baud rate from the\r
+ * default of 115200 baud\r
+ */\r
+#define MSCC_STDIO_BAUD_VALUE           115200\r
+#endif  /*MSCC_STDIO_BAUD_VALUE*/\r
+\r
+#endif  /* end of MSCC_STDIO_THRU_CORE_UART_APB */\r
+/*******************************************************************************\r
+ * End of user edit section\r
+ */\r
+#endif /* HW_PLATFORM_H */\r
+\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/syscall.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/syscall.c
new file mode 100644 (file)
index 0000000..4c99f80
--- /dev/null
@@ -0,0 +1,266 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
+ *\r
+ * @file syscall.c\r
+ * @author Microsemi SoC Products Group\r
+ * @brief Stubs for system calls.\r
+ *\r
+ * SVN $Revision: 9661 $\r
+ * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
+ */\r
+#include <stdint.h>\r
+#include <stdlib.h>\r
+#include <stddef.h>\r
+#include <unistd.h>\r
+#include <errno.h>\r
+#include <sys/stat.h>\r
+#include <sys/times.h>\r
+#include <stdio.h>\r
+#include <string.h>\r
+\r
+#include "encoding.h"\r
+\r
+#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
+\r
+#include "core_uart_apb.h"\r
+#include "hw_platform.h"\r
+\r
+#endif  /*MSCC_STDIO_THRU_CORE_UART_APB*/\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
+\r
+/*------------------------------------------------------------------------------\r
+ * CoreUARTapb instance data for the CoreUARTapb instance used for standard\r
+ * output.\r
+ */\r
+static UART_instance_t g_stdio_uart;\r
+\r
+/*==============================================================================\r
+ * Flag used to indicate if the UART driver needs to be initialized.\r
+ */\r
+static int g_stdio_uart_init_done = 0;\r
+#endif /*MSCC_STDIO_THRU_CORE_UART_APB*/\r
+\r
+#undef errno\r
+int errno;\r
+\r
+char *__env[1] = { 0 };\r
+char **environ = __env;\r
+\r
+void write_hex(int fd, uint32_t hex)\r
+{\r
+    uint8_t ii;\r
+    uint8_t jj;\r
+    char towrite;\r
+    uint8_t digit;\r
+\r
+    write( fd , "0x", 2 );\r
+\r
+    for (ii = 8 ; ii > 0; ii--)\r
+    {\r
+        jj = ii-1;\r
+        digit = ((hex & (0xF << (jj*4))) >> (jj*4));\r
+        towrite = digit < 0xA ? ('0' + digit) : ('A' +  (digit - 0xA));\r
+        write( fd, &towrite, 1);\r
+    }\r
+}\r
+\r
+               \r
+void _exit(int code)\r
+{\r
+#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
+    const char * message = "\nProgam has exited with code:";\r
+\r
+    write(STDERR_FILENO, message, strlen(message));\r
+    write_hex(STDERR_FILENO, code);\r
+#endif\r
+\r
+    while (1);\r
+}\r
+\r
+void *_sbrk(ptrdiff_t incr)\r
+{\r
+    extern char _end[];\r
+    extern char _heap_end[];\r
+    static char *curbrk = _end;\r
+\r
+    if ((curbrk + incr < _end) || (curbrk + incr > _heap_end))\r
+    {\r
+        return ((char *) - 1);\r
+    }\r
+\r
+    curbrk += incr;\r
+    return curbrk - incr;\r
+}\r
+\r
+int _isatty(int fd)\r
+{\r
+    if (fd == STDOUT_FILENO || fd == STDERR_FILENO)\r
+    {\r
+        return 1;\r
+    }\r
+\r
+    errno = EBADF;\r
+    return 0;\r
+}\r
+\r
+static int stub(int err)\r
+{\r
+    errno = err;\r
+    return -1;\r
+}\r
+\r
+int _open(const char* name, int flags, int mode)\r
+{\r
+    return stub(ENOENT);\r
+}\r
+\r
+int _openat(int dirfd, const char* name, int flags, int mode)\r
+{\r
+    return stub(ENOENT);\r
+}\r
+\r
+int _close(int fd)\r
+{\r
+    return stub(EBADF);\r
+}\r
+\r
+int _execve(const char* name, char* const argv[], char* const env[])\r
+{\r
+    return stub(ENOMEM);\r
+}\r
+\r
+int _fork()\r
+{\r
+    return stub(EAGAIN);\r
+}\r
+\r
+int _fstat(int fd, struct stat *st)\r
+{\r
+    if (isatty(fd))\r
+    {\r
+        st->st_mode = S_IFCHR;\r
+        return 0;\r
+    }\r
+\r
+    return stub(EBADF);\r
+}\r
+\r
+int _getpid()\r
+{\r
+    return 1;\r
+}\r
+\r
+int _kill(int pid, int sig)\r
+{\r
+    return stub(EINVAL);\r
+}\r
+\r
+int _link(const char *old_name, const char *new_name)\r
+{\r
+    return stub(EMLINK);\r
+}\r
+\r
+off_t _lseek(int fd, off_t ptr, int dir)\r
+{\r
+    if (_isatty(fd))\r
+    {\r
+        return 0;\r
+    }\r
+\r
+    return stub(EBADF);\r
+}\r
+\r
+ssize_t _read(int fd, void* ptr, size_t len)\r
+{\r
+#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
+    if (_isatty(fd))\r
+    {\r
+        /*--------------------------------------------------------------------------\r
+        * Initialize the UART driver if it is the first time this function is\r
+        * called.\r
+        */\r
+        if ( !g_stdio_uart_init_done )\r
+        {\r
+            /******************************************************************************\r
+            * Baud value:\r
+            * This value is calculated using the following equation:\r
+            *      BAUD_VALUE = (CLOCK / (16 * BAUD_RATE)) - 1\r
+            *****************************************************************************/\r
+            UART_init( &g_stdio_uart, MSCC_STDIO_UART_BASE_ADDR, ((SYS_CLK_FREQ/(16 * MSCC_STDIO_BAUD_VALUE))-1), (DATA_8_BITS | NO_PARITY));\r
+            g_stdio_uart_init_done = 1;\r
+        }\r
+\r
+        return UART_get_rx(&g_stdio_uart, (uint8_t*) ptr, len);\r
+    }\r
+#endif\r
+\r
+    return stub(EBADF);\r
+}\r
+\r
+int _stat(const char* file, struct stat* st)\r
+{\r
+    return stub(EACCES);\r
+}\r
+\r
+clock_t _times(struct tms* buf)\r
+{\r
+    return stub(EACCES);\r
+}\r
+\r
+int _unlink(const char* name)\r
+{\r
+    return stub(ENOENT);\r
+}\r
+\r
+int _wait(int* status)\r
+{\r
+    return stub(ECHILD);\r
+}\r
+\r
+ssize_t _write(int fd, const void* ptr, size_t len)\r
+{\r
+\r
+#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
+  const uint8_t * current = (const uint8_t *) ptr;\r
+  size_t jj;\r
+\r
+  if (_isatty(fd))\r
+  {\r
+        /*--------------------------------------------------------------------------\r
+        * Initialize the UART driver if it is the first time this function is\r
+        * called.\r
+        */\r
+        if ( !g_stdio_uart_init_done )\r
+        {\r
+            /******************************************************************************\r
+            * Baud value:\r
+            * This value is calculated using the following equation:\r
+            *      BAUD_VALUE = (CLOCK / (16 * BAUD_RATE)) - 1\r
+            *****************************************************************************/\r
+            UART_init( &g_stdio_uart, MSCC_STDIO_UART_BASE_ADDR, ((SYS_CLK_FREQ/(16 * MSCC_STDIO_BAUD_VALUE))-1), (DATA_8_BITS | NO_PARITY));\r
+            g_stdio_uart_init_done = 1;\r
+        }\r
+\r
+    for (jj = 0; jj < len; jj++)\r
+    {\r
+        UART_send(&g_stdio_uart, current + jj, 1);\r
+        if (current[jj] == '\n')\r
+        {\r
+            UART_send(&g_stdio_uart, (const uint8_t *)"\r", 1);\r
+        }\r
+    }\r
+    return len;\r
+  }\r
+#endif\r
+\r
+  return stub(EBADF);\r
+}\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/RTOSDemo Debug Renode.launch b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/RTOSDemo Debug Renode.launch
new file mode 100644 (file)
index 0000000..8f9f92c
--- /dev/null
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
+<launchConfiguration type="ilg.gnumcueclipse.debug.gdbjtag.openocd.launchConfigurationType">\r
+    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doContinue" value="true"/>\r
+    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/>\r
+    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/>\r
+    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/>\r
+    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/>\r
+    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doSecondReset" value="false"/>\r
+    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbCLient" value="true"/>\r
+    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.doStartGdbServer" value="false"/>\r
+    <booleanAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/>\r
+    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.firstResetType" value="init"/>\r
+    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value="set mem inaccessible-by-default off&#13;&#10;set arch riscv:rv32"/>\r
+    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/>\r
+    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/>\r
+    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="${openocd_path}/${openocd_executable}"/>\r
+    <intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/>\r
+    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/>\r
+    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerOther" value="--file board/microsemi-riscv.cfg"/>\r
+    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTclPortNumber" value="6666"/>\r
+    <intAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/>\r
+    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/>\r
+    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/>\r
+    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/>\r
+    <stringAttribute key="ilg.gnumcueclipse.debug.gdbjtag.svdPath" value=""/>\r
+    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>\r
+    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>\r
+    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>\r
+    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU MCU OpenOCD"/>\r
+    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>\r
+    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>\r
+    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>\r
+    <intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>\r
+    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>\r
+    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>\r
+    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>\r
+    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>\r
+    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>\r
+    <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>\r
+    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>\r
+    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>\r
+    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>\r
+    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>\r
+    <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>\r
+    <stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="${cross_prefix}gdb${cross_suffix}"/>\r
+    <booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>\r
+    <intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>\r
+    <stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>\r
+    <stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>\r
+    <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug/RTOSDemo.elf"/>\r
+    <stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="RTOSDemo"/>\r
+    <booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>\r
+    <stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.2049051127"/>\r
+    <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">\r
+        <listEntry value="/RTOSDemo"/>\r
+    </listAttribute>\r
+    <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">\r
+        <listEntry value="4"/>\r
+    </listAttribute>\r
+    <stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;&gt;&#13;&#10;    &lt;memoryBlockExpression address=&quot;2147525816&quot; label=&quot;0x8000a4b8&quot;/&gt;&#13;&#10;&lt;/memoryBlockExpressionList&gt;&#13;&#10;"/>\r
+    <stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>\r
+</launchConfiguration>\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/RTOSDemo-start-renode-emulator-and-attach.launch b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/RTOSDemo-start-renode-emulator-and-attach.launch
new file mode 100644 (file)
index 0000000..383dbed
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
+<launchConfiguration type="org.eclipse.debug.core.groups.GroupLaunchConfigurationType">\r
+    <stringAttribute key="org.eclipse.debug.core.launchGroup.0.action" value="OUTPUT_REGEXP"/>\r
+    <stringAttribute key="org.eclipse.debug.core.launchGroup.0.actionParam" value="Renode\ has\ been\ started\ successfully\ and\ is\ ready\ for\ a\ gdb\ connection"/>\r
+    <booleanAttribute key="org.eclipse.debug.core.launchGroup.0.adoptIfRunning" value="false"/>\r
+    <booleanAttribute key="org.eclipse.debug.core.launchGroup.0.enabled" value="true"/>\r
+    <stringAttribute key="org.eclipse.debug.core.launchGroup.0.mode" value="run"/>\r
+    <stringAttribute key="org.eclipse.debug.core.launchGroup.0.name" value="Mi-V-Renode-emulation-platform"/>\r
+    <stringAttribute key="org.eclipse.debug.core.launchGroup.1.action" value="NONE"/>\r
+    <booleanAttribute key="org.eclipse.debug.core.launchGroup.1.adoptIfRunning" value="false"/>\r
+    <booleanAttribute key="org.eclipse.debug.core.launchGroup.1.enabled" value="true"/>\r
+    <stringAttribute key="org.eclipse.debug.core.launchGroup.1.mode" value="inherit"/>\r
+    <stringAttribute key="org.eclipse.debug.core.launchGroup.1.name" value="RTOSDemo Debug Renode"/>\r
+</launchConfiguration>\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/blinky_demo/main_blinky.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/blinky_demo/main_blinky.c
new file mode 100644 (file)
index 0000000..7688ed8
--- /dev/null
@@ -0,0 +1,206 @@
+/*\r
+ * FreeRTOS Kernel V10.1.1\r
+ * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
+ * this software and associated documentation files (the "Software"), to deal in\r
+ * the Software without restriction, including without limitation the rights to\r
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
+ * the Software, and to permit persons to whom the Software is furnished to do so,\r
+ * subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in all\r
+ * copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * http://www.FreeRTOS.org\r
+ * http://aws.amazon.com/freertos\r
+ *\r
+ * 1 tab == 4 spaces!\r
+ */\r
+\r
+/******************************************************************************\r
+ * NOTE 1:  This project provides two demo applications.  A simple blinky\r
+ * style project, and a more comprehensive test and demo application.  The\r
+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select\r
+ * between the two.  See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\r
+ * in main.c.  This file implements the simply blinky style version.\r
+ *\r
+ * NOTE 2:  This file only contains the source code that is specific to the\r
+ * basic demo.  Generic functions, such FreeRTOS hook functions, and functions\r
+ * required to configure the hardware are defined in main.c.\r
+ ******************************************************************************\r
+ *\r
+ * main_blinky() creates one queue, and two tasks.  It then starts the\r
+ * scheduler.\r
+ *\r
+ * The Queue Send Task:\r
+ * The queue send task is implemented by the prvQueueSendTask() function in\r
+ * this file.  prvQueueSendTask() sits in a loop that causes it to repeatedly\r
+ * block for 1000 milliseconds, before sending the value 100 to the queue that\r
+ * was created within main_blinky().  Once the value is sent, the task loops\r
+ * back around to block for another 1000 milliseconds...and so on.\r
+ *\r
+ * The Queue Receive Task:\r
+ * The queue receive task is implemented by the prvQueueReceiveTask() function\r
+ * in this file.  prvQueueReceiveTask() sits in a loop where it repeatedly\r
+ * blocks on attempts to read data from the queue that was created within\r
+ * main_blinky().  When data is received, the task checks the value of the\r
+ * data, and if the value equals the expected 100, writes 'Blink' to the UART\r
+ * (the UART is used in place of the LED to allow easy execution in QEMU).  The\r
+ * 'block time' parameter passed to the queue receive function specifies that\r
+ * the task should be held in the Blocked state indefinitely to wait for data to\r
+ * be available on the queue.  The queue receive task will only leave the\r
+ * Blocked state when the queue send task writes to the queue.  As the queue\r
+ * send task writes to the queue every 1000 milliseconds, the queue receive\r
+ * task leaves the Blocked state every 1000 milliseconds, and therefore toggles\r
+ * the LED every 200 milliseconds.\r
+ */\r
+\r
+/* Standard includes. */\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <unistd.h>\r
+\r
+/* Kernel includes. */\r
+#include "FreeRTOS.h"\r
+#include "task.h"\r
+#include "queue.h"\r
+\r
+/* Priorities used by the tasks. */\r
+#define mainQUEUE_RECEIVE_TASK_PRIORITY                ( tskIDLE_PRIORITY + 2 )\r
+#define        mainQUEUE_SEND_TASK_PRIORITY            ( tskIDLE_PRIORITY + 1 )\r
+\r
+/* The rate at which data is sent to the queue.  The 200ms value is converted\r
+to ticks using the pdMS_TO_TICKS() macro. */\r
+#define mainQUEUE_SEND_FREQUENCY_MS                    pdMS_TO_TICKS( 1000 )\r
+\r
+/* The maximum number items the queue can hold.  The priority of the receiving\r
+task is above the priority of the sending task, so the receiving task will\r
+preempt the sending task and remove the queue items each time the sending task\r
+writes to the queue.  Therefore the queue will never have more than one item in\r
+it at any time, and even with a queue length of 1, the sending task will never\r
+find the queue full. */\r
+#define mainQUEUE_LENGTH                                       ( 1 )\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/*\r
+ * Called by main when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1 in\r
+ * main.c.\r
+ */\r
+void main_blinky( void );\r
+\r
+/*\r
+ * The tasks as described in the comments at the top of this file.\r
+ */\r
+static void prvQueueReceiveTask( void *pvParameters );\r
+static void prvQueueSendTask( void *pvParameters );\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/* The queue used by both tasks. */\r
+static QueueHandle_t xQueue = NULL;\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+void main_blinky( void )\r
+{\r
+       /* Create the queue. */\r
+       xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) );\r
+\r
+       if( xQueue != NULL )\r
+       {\r
+               /* Start the two tasks as described in the comments at the top of this\r
+               file. */\r
+               xTaskCreate( prvQueueReceiveTask,                               /* The function that implements the task. */\r
+                                       "Rx",                                                           /* The text name assigned to the task - for debug only as it is not used by the kernel. */\r
+                                       configMINIMAL_STACK_SIZE * 2U,                  /* The size of the stack to allocate to the task. */\r
+                                       NULL,                                                           /* The parameter passed to the task - not used in this case. */\r
+                                       mainQUEUE_RECEIVE_TASK_PRIORITY,        /* The priority assigned to the task. */\r
+                                       NULL );                                                         /* The task handle is not required, so NULL is passed. */\r
+\r
+               xTaskCreate( prvQueueSendTask, "TX", configMINIMAL_STACK_SIZE * 2U, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL );\r
+\r
+               /* Start the tasks and timer running. */\r
+               vTaskStartScheduler();\r
+       }\r
+\r
+       /* If all is well, the scheduler will now be running, and the following\r
+       line will never be reached.  If the following line does execute, then\r
+       there was insufficient FreeRTOS heap memory available for the Idle and/or\r
+       timer tasks to be created.  See the memory management section on the\r
+       FreeRTOS web site for more details on the FreeRTOS heap\r
+       http://www.freertos.org/a00111.html. */\r
+       for( ;; );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvQueueSendTask( void *pvParameters )\r
+{\r
+TickType_t xNextWakeTime;\r
+const unsigned long ulValueToSend = 100UL;\r
+BaseType_t xReturned;\r
+\r
+       /* Remove compiler warning about unused parameter. */\r
+       ( void ) pvParameters;\r
+\r
+       /* Initialise xNextWakeTime - this only needs to be done once. */\r
+       xNextWakeTime = xTaskGetTickCount();\r
+\r
+       for( ;; )\r
+       {\r
+               /* Place this task in the blocked state until it is time to run again. */\r
+               vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );\r
+\r
+               /* Send to the queue - causing the queue receive task to unblock and\r
+               toggle the LED.  0 is used as the block time so the sending operation\r
+               will not block - it shouldn't need to block as the queue should always\r
+               be empty at this point in the code. */\r
+               xReturned = xQueueSend( xQueue, &ulValueToSend, 0U );\r
+               configASSERT( xReturned == pdPASS );\r
+       }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvQueueReceiveTask( void *pvParameters )\r
+{\r
+unsigned long ulReceivedValue;\r
+const unsigned long ulExpectedValue = 100UL;\r
+const char * const pcPassMessage = "Blink\r\n";\r
+const char * const pcFailMessage = "Unexpected value received\r\n";\r
+extern void vSendString( const char * const pcString );\r
+extern void vToggleLED( void );\r
+\r
+       /* Remove compiler warning about unused parameter. */\r
+       ( void ) pvParameters;\r
+\r
+       for( ;; )\r
+       {\r
+               /* Wait until something arrives in the queue - this task will block\r
+               indefinitely provided INCLUDE_vTaskSuspend is set to 1 in\r
+               FreeRTOSConfig.h. */\r
+               xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );\r
+\r
+               /*  To get here something must have been received from the queue, but\r
+               is it the expected value?  If it is, toggle the LED. */\r
+               if( ulReceivedValue == ulExpectedValue )\r
+               {\r
+                       vSendString( pcPassMessage );\r
+                       vToggleLED();\r
+                       ulReceivedValue = 0U;\r
+               }\r
+               else\r
+               {\r
+                       vSendString( pcFailMessage );\r
+               }\r
+       }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/full_demo/RegTest.S b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/full_demo/RegTest.S
new file mode 100644 (file)
index 0000000..702454f
--- /dev/null
@@ -0,0 +1,260 @@
+/*\r
+ * FreeRTOS Kernel V10.1.1\r
+ * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
+ * this software and associated documentation files (the "Software"), to deal in\r
+ * the Software without restriction, including without limitation the rights to\r
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
+ * the Software, and to permit persons to whom the Software is furnished to do so,\r
+ * subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in all\r
+ * copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * http://www.FreeRTOS.org\r
+ * http://aws.amazon.com/freertos\r
+ *\r
+ * 1 tab == 4 spaces!\r
+ */\r
+\r
+       .extern ulRegTest1LoopCounter\r
+       .extern ulRegTest2LoopCounter\r
+\r
+       .global vRegTest1Implementation\r
+       .global vRegTest2Implementation\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/*\r
+ * The register check tasks are described in the comments at the top of\r
+ * main_full.c.\r
+ */\r
+\r
+vRegTest1Implementation:\r
+\r
+       /* Fill the core registers with known values. */\r
+       li x5, 0x5\r
+       li x6, 0x6\r
+       li x7, 0x7\r
+       li x8, 0x8\r
+       li x9, 0x9\r
+       li x10, 0xa\r
+       li x11, 0xb\r
+       li x12, 0xc\r
+       li x13, 0xd\r
+       li x14, 0xe\r
+       li x15, 0xf\r
+       li x16, 0x10\r
+       li x17, 0x11\r
+       li x18, 0x12\r
+       li x19, 0x13\r
+       li x20, 0x14\r
+       li x21, 0x15\r
+       li x22, 0x16\r
+       li x23, 0x17\r
+       li x24, 0x18\r
+       li x25, 0x19\r
+       li x26, 0x1a\r
+       li x27, 0x1b\r
+       li x28, 0x1c\r
+       li x29, 0x1d\r
+       li x30, 0x1e\r
+\r
+reg1_loop:\r
+\r
+       /* Check each register still contains the expected known value.\r
+       vRegTest1Implementation uses x31 as the temporary, vRegTest2Implementation\r
+       uses x5 as the temporary. */\r
+       li x31, 0x5\r
+       bne x31, x5, reg1_error_loop\r
+       li x31, 0x6\r
+       bne x31, x6, reg1_error_loop\r
+       li x31, 0x7\r
+       bne x31, x7, reg1_error_loop\r
+       li x31, 0x8\r
+       bne x31, x8, reg1_error_loop\r
+       li x31, 0x9\r
+       bne x31, x9, reg1_error_loop\r
+       li x31, 0xa\r
+       bne x31, x10, reg1_error_loop\r
+       li x31, 0xb\r
+       bne x31, x11, reg1_error_loop\r
+       li x31, 0xc\r
+       bne x31, x12, reg1_error_loop\r
+       li x31, 0xd\r
+       bne x31, x13, reg1_error_loop\r
+       li x31, 0xe\r
+       bne x31, x14, reg1_error_loop\r
+       li x31, 0xf\r
+       bne x31, x15, reg1_error_loop\r
+       li x31, 0x10\r
+       bne x31, x16, reg1_error_loop\r
+       li x31, 0x11\r
+       bne x31, x17, reg1_error_loop\r
+       li x31, 0x12\r
+       bne x31, x18, reg1_error_loop\r
+       li x31, 0x13\r
+       bne x31, x19, reg1_error_loop\r
+       li x31, 0x14\r
+       bne x31, x20, reg1_error_loop\r
+       li x31, 0x15\r
+       bne x31, x21, reg1_error_loop\r
+       li x31, 0x16\r
+       bne x31, x22, reg1_error_loop\r
+       li x31, 0x17\r
+       bne x31, x23, reg1_error_loop\r
+       li x31, 0x18\r
+       bne x31, x24, reg1_error_loop\r
+       li x31, 0x19\r
+       bne x31, x25, reg1_error_loop\r
+       li x31, 0x1a\r
+       bne x31, x26, reg1_error_loop\r
+       li x31, 0x1b\r
+       bne x31, x27, reg1_error_loop\r
+       li x31, 0x1c\r
+       bne x31, x28, reg1_error_loop\r
+       li x31, 0x1d\r
+       bne x31, x29, reg1_error_loop\r
+       li x31, 0x1e\r
+       bne x31, x30, reg1_error_loop\r
+\r
+       /* Everything passed, increment the loop counter. */\r
+       lw x31, ulRegTest1LoopCounterConst\r
+       lw x30, 0(x31)\r
+       addi x30, x30, 1\r
+       sw x30, 0(x31)\r
+\r
+       /* Restore clobbered register reading for next loop. */\r
+       li x30, 0x1e\r
+\r
+       /* Yield to increase code coverage. */\r
+       ecall\r
+\r
+       /* Start again. */\r
+       jal reg1_loop\r
+\r
+reg1_error_loop:\r
+       /* Jump here if a register contains an uxpected value.  This stops the loop\r
+       counter being incremented so the check task knows an error was found. */\r
+       jal reg1_error_loop\r
+\r
+ulRegTest1LoopCounterConst: .word ulRegTest1LoopCounter\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+vRegTest2Implementation:\r
+\r
+       /* Fill the core registers with known values. */\r
+       li x6, 0x61\r
+       li x7, 0x71\r
+       li x8, 0x81\r
+       li x9, 0x91\r
+       li x10, 0xa1\r
+       li x11, 0xb1\r
+       li x12, 0xc1\r
+       li x13, 0xd1\r
+       li x14, 0xe1\r
+       li x15, 0xf1\r
+       li x16, 0x20\r
+       li x17, 0x21\r
+       li x18, 0x22\r
+       li x19, 0x23\r
+       li x20, 0x24\r
+       li x21, 0x25\r
+       li x22, 0x26\r
+       li x23, 0x27\r
+       li x24, 0x28\r
+       li x25, 0x29\r
+       li x26, 0x2a\r
+       li x27, 0x2b\r
+       li x28, 0x2c\r
+       li x29, 0x2d\r
+       li x30, 0x2e\r
+       li x31, 0x2f\r
+\r
+Reg2_loop:\r
+\r
+       /* Check each register still contains the expected known value.\r
+       vRegTest2Implementation uses x5 as the temporary, vRegTest1Implementation\r
+       uses x31 as the temporary. */\r
+       li x5, 0x61\r
+       bne x5, x6, reg2_error_loop\r
+       li x5, 0x71\r
+       bne x5, x7, reg2_error_loop\r
+       li x5, 0x81\r
+       bne x5, x8, reg2_error_loop\r
+       li x5, 0x91\r
+       bne x5, x9, reg2_error_loop\r
+       li x5, 0xa1\r
+       bne x5, x10, reg2_error_loop\r
+       li x5, 0xb1\r
+       bne x5, x11, reg2_error_loop\r
+       li x5, 0xc1\r
+       bne x5, x12, reg2_error_loop\r
+       li x5, 0xd1\r
+       bne x5, x13, reg2_error_loop\r
+       li x5, 0xe1\r
+       bne x5, x14, reg2_error_loop\r
+       li x5, 0xf1\r
+       bne x5, x15, reg2_error_loop\r
+       li x5, 0x20\r
+       bne x5, x16, reg2_error_loop\r
+       li x5, 0x21\r
+       bne x5, x17, reg2_error_loop\r
+       li x5, 0x22\r
+       bne x5, x18, reg2_error_loop\r
+       li x5, 0x23\r
+       bne x5, x19, reg2_error_loop\r
+       li x5, 0x24\r
+       bne x5, x20, reg2_error_loop\r
+       li x5, 0x25\r
+       bne x5, x21, reg2_error_loop\r
+       li x5, 0x26\r
+       bne x5, x22, reg2_error_loop\r
+       li x5, 0x27\r
+       bne x5, x23, reg2_error_loop\r
+       li x5, 0x28\r
+       bne x5, x24, reg2_error_loop\r
+       li x5, 0x29\r
+       bne x5, x25, reg2_error_loop\r
+       li x5, 0x2a\r
+       bne x5, x26, reg2_error_loop\r
+       li x5, 0x2b\r
+       bne x5, x27, reg2_error_loop\r
+       li x5, 0x2c\r
+       bne x5, x28, reg2_error_loop\r
+       li x5, 0x2d\r
+       bne x5, x29, reg2_error_loop\r
+       li x5, 0x2e\r
+       bne x5, x30, reg2_error_loop\r
+       li x5, 0x2f\r
+       bne x5, x31, reg2_error_loop\r
+\r
+       /* Everything passed, increment the loop counter. */\r
+       lw x5, ulRegTest2LoopCounterConst\r
+       lw x6, 0(x5)\r
+       addi x6, x6, 1\r
+       sw x6, 0(x5)\r
+\r
+       /* Restore clobbered register reading for next loop. */\r
+       li x6, 0x61\r
+\r
+       /* Start again. */\r
+       jal Reg2_loop\r
+\r
+reg2_error_loop:\r
+       /* Jump here if a register contains an uxpected value.  This stops the loop\r
+       counter being incremented so the check task knows an error was found. */\r
+       jal reg2_error_loop\r
+\r
+ulRegTest2LoopCounterConst: .word ulRegTest2LoopCounter\r
+\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/full_demo/main_full.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/full_demo/main_full.c
new file mode 100644 (file)
index 0000000..dc7d768
--- /dev/null
@@ -0,0 +1,479 @@
+/*\r
+ * FreeRTOS Kernel V10.1.1\r
+ * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
+ * this software and associated documentation files (the "Software"), to deal in\r
+ * the Software without restriction, including without limitation the rights to\r
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
+ * the Software, and to permit persons to whom the Software is furnished to do so,\r
+ * subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in all\r
+ * copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * http://www.FreeRTOS.org\r
+ * http://aws.amazon.com/freertos\r
+ *\r
+ * 1 tab == 4 spaces!\r
+ */\r
+\r
+/******************************************************************************\r
+ * NOTE 1:  This project provides two demo applications.  A simple blinky style\r
+ * project, and a more comprehensive test and demo application.  The\r
+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select\r
+ * between the two.  See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\r
+ * in main.c.  This file implements the comprehensive test and demo version.\r
+ *\r
+ * NOTE 2:  This file only contains the source code that is specific to the\r
+ * full demo.  Generic functions, such FreeRTOS hook functions, and functions\r
+ * required to configure the hardware, are defined in main.c.\r
+ *\r
+ ******************************************************************************\r
+ *\r
+ * main_full() creates all the demo application tasks and software timers, then\r
+ * starts the scheduler.  The web documentation provides more details of the\r
+ * standard demo application tasks, which provide no particular functionality,\r
+ * but do provide a good example of how to use the FreeRTOS API.\r
+ *\r
+ * In addition to the standard demo tasks, the following tasks and tests are\r
+ * defined and/or created within this file:\r
+ *\r
+ * "Reg test" tasks - These fill both the core registers with known values, then\r
+ * check that each register maintains its expected value for the lifetime of the\r
+ * task.  Each task uses a different set of values.  The reg test tasks execute\r
+ * with a very low priority, so get preempted very frequently.  A register\r
+ * containing an unexpected value is indicative of an error in the context\r
+ * switching mechanism.\r
+ *\r
+ * "Check" task - The check executes every three seconds.  It checks that all\r
+ * the standard demo tasks, and the register check tasks, are not only still\r
+ * executing, but are executing without reporting any errors.  If the check task\r
+ * discovers that a task has either stalled, or reported an error, then it\r
+ * prints an error message to the UART, otherwise it prints "Pass.".\r
+ */\r
+\r
+/* Standard includes. */\r
+#include <stdio.h>\r
+#include <string.h>\r
+\r
+/* Kernel includes. */\r
+#include "FreeRTOS.h"\r
+#include "task.h"\r
+#include "timers.h"\r
+#include "semphr.h"\r
+\r
+/* Microsemi incldues. */\r
+#include "core_timer.h"\r
+#include "riscv_hal.h"\r
+\r
+/* Standard demo application includes. */\r
+#include "dynamic.h"\r
+#include "blocktim.h"\r
+#include "GenQTest.h"\r
+#include "recmutex.h"\r
+#include "TimerDemo.h"\r
+#include "EventGroupsDemo.h"\r
+#include "TaskNotify.h"\r
+#include "AbortDelay.h"\r
+#include "countsem.h"\r
+#include "death.h"\r
+#include "MessageBufferDemo.h"\r
+#include "StreamBufferDemo.h"\r
+#include "StreamBufferInterrupt.h"\r
+\r
+/* Priorities for the demo application tasks. */\r
+#define mainCHECK_TASK_PRIORITY                                ( configMAX_PRIORITIES - 1 )\r
+#define mainCREATOR_TASK_PRIORITY                      ( tskIDLE_PRIORITY + 3UL )\r
+\r
+/* The period of the check task, in ms, converted to ticks using the\r
+pdMS_TO_TICKS() macro.  mainNO_ERROR_CHECK_TASK_PERIOD is used if no errors have\r
+been found, mainERROR_CHECK_TASK_PERIOD is used if an error has been found. */\r
+#define mainNO_ERROR_CHECK_TASK_PERIOD         pdMS_TO_TICKS( 3000UL )\r
+#define mainERROR_CHECK_TASK_PERIOD            pdMS_TO_TICKS( 500UL )\r
+\r
+/* Parameters that are passed into the register check tasks solely for the\r
+purpose of ensuring parameters are passed into tasks correctly. */\r
+#define mainREG_TEST_TASK_1_PARAMETER          ( ( void * ) 0x12345678 )\r
+#define mainREG_TEST_TASK_2_PARAMETER          ( ( void * ) 0x87654321 )\r
+\r
+/* The base period used by the timer test tasks. */\r
+#define mainTIMER_TEST_PERIOD                          ( 50 )\r
+\r
+/* The size of the stack allocated to the check task (as described in the\r
+comments at the top of this file. */\r
+#define mainCHECK_TASK_STACK_SIZE_WORDS 100\r
+\r
+/* Size of the stacks to allocated for the register check tasks. */\r
+#define mainREG_TEST_STACK_SIZE_WORDS 70\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/*\r
+ * Called by main() to run the full demo (as opposed to the blinky demo) when\r
+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.\r
+ */\r
+void main_full( void );\r
+\r
+/*\r
+ * The check task, as described at the top of this file.\r
+ */\r
+static void prvCheckTask( void *pvParameters );\r
+\r
+/*\r
+ * Initialise and start the peripheral timers that are used to exercise external\r
+ * interrupt processing.\r
+ */\r
+static void prvSetupPeripheralTimers( void );\r
+\r
+/*\r
+ * Register check tasks as described at the top of this file.  The nature of\r
+ * these files necessitates that they are written in an assembly file, but the\r
+ * entry points are kept in the C file for the convenience of checking the task\r
+ * parameter.\r
+ */\r
+static void prvRegTestTaskEntry1( void *pvParameters );\r
+extern void vRegTest1Implementation( void );\r
+static void prvRegTestTaskEntry2( void *pvParameters );\r
+extern void vRegTest2Implementation( void );\r
+\r
+/*\r
+ * Tick hook used by the full demo, which includes code that interacts with\r
+ * some of the tests.\r
+ */\r
+void vFullDemoTickHook( void );\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/* Timers used to exercise external interrupt processing. */\r
+static timer_instance_t g_timer0, g_timer1;\r
+\r
+/* Variables incremented by the peripheral timers used to exercise external\r
+interrupts. */\r
+volatile uint32_t ulTimer0Interrupts = 0, ulTimer1Interrupts = 0;\r
+\r
+/* The following two variables are used to communicate the status of the\r
+register check tasks to the check task.  If the variables keep incrementing,\r
+then the register check tasks have not discovered any errors.  If a variable\r
+stops incrementing, then an error has been found. */\r
+volatile uint32_t ulRegTest1LoopCounter = 0UL, ulRegTest2LoopCounter = 0UL;\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+void main_full( void )\r
+{\r
+       /* Start all the other standard demo/test tasks.  They have no particular\r
+       functionality, but do demonstrate how to use the FreeRTOS API and test the\r
+       kernel port. */\r
+       vStartDynamicPriorityTasks();\r
+       vCreateBlockTimeTasks();\r
+       vStartGenericQueueTasks( tskIDLE_PRIORITY );\r
+       vStartRecursiveMutexTasks();\r
+       vStartTimerDemoTask( mainTIMER_TEST_PERIOD );\r
+       vStartEventGroupTasks();\r
+       vStartTaskNotifyTask();\r
+       vCreateAbortDelayTasks();\r
+       vStartCountingSemaphoreTasks();\r
+       vStartMessageBufferTasks( configMINIMAL_STACK_SIZE  );\r
+       vStartStreamBufferTasks();\r
+       vStartStreamBufferInterruptDemo();\r
+\r
+       /* Create the register check tasks, as described at the top of this     file.\r
+       Use xTaskCreateStatic() to create a task using only statically allocated\r
+       memory. */\r
+       xTaskCreate( prvRegTestTaskEntry1,                      /* The function that implements the task. */\r
+                                "Reg1",                                                /* The name of the task. */\r
+                                mainREG_TEST_STACK_SIZE_WORDS, /* Size of stack to allocate for the task - in words not bytes!. */\r
+                                mainREG_TEST_TASK_1_PARAMETER, /* Parameter passed into the task. */\r
+                                tskIDLE_PRIORITY,                              /* Priority of the task. */\r
+                                NULL );                                                /* Can be used to pass out a handle to the created task. */\r
+       xTaskCreate( prvRegTestTaskEntry2, "Reg2", mainREG_TEST_STACK_SIZE_WORDS, mainREG_TEST_TASK_2_PARAMETER, tskIDLE_PRIORITY, NULL );\r
+\r
+       /* Create the task that performs the 'check' functionality,     as described at\r
+       the top of this file. */\r
+       xTaskCreate( prvCheckTask, "Check", mainCHECK_TASK_STACK_SIZE_WORDS, NULL, mainCHECK_TASK_PRIORITY, NULL );\r
+\r
+       /* The set of tasks created by the following function call have to be\r
+       created last as they keep account of the number of tasks they expect to see\r
+       running. */\r
+       vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY );\r
+\r
+       /* Start the timers that are used to exercise external interrupt handling. */\r
+       prvSetupPeripheralTimers();\r
+\r
+       /* Start the scheduler. */\r
+       vTaskStartScheduler();\r
+\r
+       /* If all is well, the scheduler will now be running, and the following\r
+       line will never be reached.  If the following line does execute, then\r
+       there was insufficient FreeRTOS heap memory available for the Idle and/or\r
+       timer tasks to be created.  See the memory management section on the\r
+       FreeRTOS web site for more details on the FreeRTOS heap\r
+       http://www.freertos.org/a00111.html. */\r
+       for( ;; );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvCheckTask( void *pvParameters )\r
+{\r
+TickType_t xDelayPeriod = mainNO_ERROR_CHECK_TASK_PERIOD;\r
+TickType_t xLastExecutionTime;\r
+uint32_t ulLastRegTest1Value = 0, ulLastRegTest2Value = 0;\r
+uint32_t ulLastTimer0Interrupts = 0, ulLastTimer1Interrupts = 0;\r
+char * const pcPassMessage = ".";\r
+char * pcStatusMessage = pcPassMessage;\r
+extern void vSendString( const char * const pcString );\r
+extern void vToggleLED( void );\r
+\r
+       /* Just to stop compiler warnings. */\r
+       ( void ) pvParameters;\r
+\r
+       /* Start with a pass message, after which a '.' character will be printed\r
+       out on each successful loop. */\r
+       vSendString( "Pass" );\r
+\r
+       /* Initialise xLastExecutionTime so the first call to vTaskDelayUntil()\r
+       works correctly. */\r
+       xLastExecutionTime = xTaskGetTickCount();\r
+\r
+       /* Cycle for ever, delaying then checking all the other tasks are still\r
+       operating without error.  The onboard LED is toggled on each iteration.\r
+       If an error is detected then the delay period is decreased from\r
+       mainNO_ERROR_CHECK_TASK_PERIOD to mainERROR_CHECK_TASK_PERIOD.  This has the\r
+       effect of increasing the rate at which the onboard LED toggles, and in so\r
+       doing gives visual feedback of the system status. */\r
+       for( ;; )\r
+       {\r
+               /* Delay until it is time to execute again. */\r
+               vTaskDelayUntil( &xLastExecutionTime, xDelayPeriod );\r
+\r
+               /* Check all the demo tasks (other than the flash tasks) to ensure\r
+               that they are all still running, and that none have detected an error. */\r
+               if( xAreDynamicPriorityTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Dynamic priority demo/tests.\r\n";\r
+               }\r
+\r
+               if ( xAreBlockTimeTestTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Block time demo/tests.\r\n";\r
+               }\r
+\r
+               if ( xAreGenericQueueTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Generic queue demo/tests.\r\n";\r
+               }\r
+\r
+               if ( xAreRecursiveMutexTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Recursive mutex demo/tests.\r\n";\r
+               }\r
+\r
+               if( xAreTimerDemoTasksStillRunning( ( TickType_t ) xDelayPeriod ) == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Timer demo/tests.\r\n";\r
+               }\r
+\r
+               if( xAreEventGroupTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Event group demo/tests.\r\n";\r
+               }\r
+\r
+               if( xAreTaskNotificationTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Task notification demo/tests.\r\n";\r
+               }\r
+\r
+               if( xAreAbortDelayTestTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Abort delay.\r\n";\r
+               }\r
+\r
+               if( xAreCountingSemaphoreTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Counting semaphores.\r\n";\r
+               }\r
+\r
+               if( xIsCreateTaskStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Suicide tasks.\r\n";\r
+               }\r
+\r
+               if( xAreMessageBufferTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Message buffer.\r\n";\r
+               }\r
+\r
+               if( xAreStreamBufferTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Stream buffer.\r\n";\r
+               }\r
+\r
+               if( xIsInterruptStreamBufferDemoStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Stream buffer interrupt.\r\n";\r
+               }\r
+\r
+               /* Check that the register test 1 task is still running. */\r
+               if( ulLastRegTest1Value == ulRegTest1LoopCounter )\r
+               {\r
+                       pcStatusMessage = "ERROR: Register test 1.\r\n";\r
+               }\r
+               ulLastRegTest1Value = ulRegTest1LoopCounter;\r
+\r
+               /* Check that the register test 2 task is still running. */\r
+               if( ulLastRegTest2Value == ulRegTest2LoopCounter )\r
+               {\r
+                       pcStatusMessage = "ERROR: Register test 2.\r\n";\r
+               }\r
+               ulLastRegTest2Value = ulRegTest2LoopCounter;\r
+\r
+               /* Check interrupts from the peripheral timers are being handled. */\r
+               if( ulLastTimer0Interrupts == ulTimer0Interrupts )\r
+               {\r
+                       pcStatusMessage = "ERROR: Peripheral timer 0.\r\n";\r
+               }\r
+               ulLastTimer0Interrupts = ulTimer0Interrupts;\r
+\r
+               if( ulLastTimer1Interrupts == ulTimer1Interrupts )\r
+               {\r
+                       pcStatusMessage = "ERROR: Peripheral timer 1.\r\n";\r
+               }\r
+               ulLastTimer1Interrupts = ulTimer1Interrupts;\r
+\r
+               /* Write the status message to the UART. */\r
+               vSendString( pcStatusMessage );\r
+\r
+               /* If an error has been found then increase the LED toggle rate by\r
+               increasing the cycle frequency. */\r
+               if( pcStatusMessage != pcPassMessage )\r
+               {\r
+                       xDelayPeriod = mainERROR_CHECK_TASK_PERIOD;\r
+               }\r
+       }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvRegTestTaskEntry1( void *pvParameters )\r
+{\r
+       /* Although the regtest task is written in assembler, its entry point is\r
+       written in C for convenience of checking the task parameter is being passed\r
+       in correctly. */\r
+       if( pvParameters == mainREG_TEST_TASK_1_PARAMETER )\r
+       {\r
+               /* Start the part of the test that is written in assembler. */\r
+               vRegTest1Implementation();\r
+       }\r
+\r
+       /* The following line will only execute if the task parameter is found to\r
+       be incorrect.  The check task will detect that the regtest loop counter is\r
+       not being incremented and flag an error. */\r
+       vTaskDelete( NULL );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvRegTestTaskEntry2( void *pvParameters )\r
+{\r
+       /* Although the regtest task is written in assembler, its entry point is\r
+       written in C for convenience of checking the task parameter is being passed\r
+       in correctly. */\r
+       if( pvParameters == mainREG_TEST_TASK_2_PARAMETER )\r
+       {\r
+               /* Start the part of the test that is written in assembler. */\r
+               vRegTest2Implementation();\r
+       }\r
+\r
+       /* The following line will only execute if the task parameter is found to\r
+       be incorrect.  The check task will detect that the regtest loop counter is\r
+       not being incremented and flag an error. */\r
+       vTaskDelete( NULL );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vFullDemoTickHook( void )\r
+{\r
+       /* The full demo includes a software timer demo/test that requires\r
+       prodding periodically from the tick interrupt. */\r
+       vTimerPeriodicISRTests();\r
+\r
+       /* Call the periodic event group from ISR demo. */\r
+       vPeriodicEventGroupsProcessing();\r
+\r
+       /* Use task notifications from an interrupt. */\r
+       xNotifyTaskFromISR();\r
+\r
+       /* Writes to stream buffer byte by byte to test the stream buffer trigger\r
+       level functionality. */\r
+       vPeriodicStreamBufferProcessing();\r
+\r
+       /* Writes a string to a string buffer four bytes at a time to demonstrate\r
+       a stream being sent from an interrupt to a task. */\r
+       vBasicStreamBufferSendFromISR();\r
+\r
+       /* Called from vApplicationTickHook() when the project is configured to\r
+       build the full test/demo applications. */\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvSetupPeripheralTimers( void )\r
+{\r
+       TMR_init(       &g_timer0,\r
+                               CORETIMER0_BASE_ADDR,\r
+                               TMR_CONTINUOUS_MODE,\r
+                               PRESCALER_DIV_1024,\r
+                               83000 );\r
+\r
+    TMR_init(  &g_timer1,\r
+                               CORETIMER1_BASE_ADDR,\r
+                               TMR_CONTINUOUS_MODE,\r
+                               PRESCALER_DIV_512,\r
+                               42000 );\r
+\r
+       /* In this version of the PLIC, the priorities are fixed at 1.\r
+       Lower numbered devices have higher priorities. But this code is given as\r
+       an example.\r
+       */\r
+       PLIC_SetPriority( External_30_IRQn, 1 );\r
+       PLIC_SetPriority( External_31_IRQn, 1 );\r
+\r
+       /*Enable Timer 1 & 0 Interrupt*/\r
+       PLIC_EnableIRQ( External_30_IRQn );\r
+       PLIC_EnableIRQ( External_31_IRQn );\r
+\r
+       /* Enable the timers */\r
+       TMR_enable_int( &g_timer0 );\r
+       TMR_enable_int( &g_timer1 );\r
+\r
+       /* Make sure timers don't interrupt until the scheduler is running. */\r
+       portDISABLE_INTERRUPTS();\r
+\r
+       /*Start the timer*/\r
+       TMR_start( &g_timer0 );\r
+       TMR_start( &g_timer1 );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+/*Core Timer 0 Interrupt Handler*/\r
+uint8_t External_30_IRQHandler( void )\r
+{\r
+       ulTimer0Interrupts++;\r
+    TMR_clear_int(&g_timer0);\r
+    return( EXT_IRQ_KEEP_ENABLED );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+/*Core Timer 1 Interrupt Handler*/\r
+uint8_t External_31_IRQHandler( void )\r
+{\r
+       ulTimer1Interrupts++;\r
+    TMR_clear_int(&g_timer1);\r
+\r
+    return( EXT_IRQ_KEEP_ENABLED );\r
+}\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/hw_platform.h b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/hw_platform.h
new file mode 100644 (file)
index 0000000..b56f103
--- /dev/null
@@ -0,0 +1,119 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2017 Microsemi Corporation.  All rights reserved.\r
+ *\r
+ * Platform definitions\r
+ * Version based on requirements of RISCV-HAL\r
+ *\r
+ * SVN $Revision: 9587 $\r
+ * SVN $Date: 2017-11-16 12:53:31 +0530 (Thu, 16 Nov 2017) $\r
+ */\r
+ /*=========================================================================*//**\r
+  @mainpage Sample file detailing how hw_platform.h should be constructed for \r
+    the Mi-V processors.\r
+\r
+    @section intro_sec Introduction\r
+    The hw_platform.h is to be located in the project root directory.\r
+    Currently this file must be hand crafted when using the Mi-V Soft Processor.\r
+    \r
+    You can use this file as sample.\r
+    Rename this file from sample_hw_platform.h to hw_platform.h and store it in\r
+    the root folder of your project. Then customize it per your HW design.\r
+\r
+    @section driver_configuration Project configuration Instructions\r
+    1. Change SYS_CLK_FREQ define to frequency of Mi-V Soft processor clock\r
+    2  Add all other core BASE addresses\r
+    3. Add peripheral Core Interrupt to Mi-V Soft processor interrupt mappings\r
+    4. Define MSCC_STDIO_UART_BASE_ADDR if you want a CoreUARTapb mapped to STDIO\r
+*//*=========================================================================*/\r
+\r
+#ifndef HW_PLATFORM_H\r
+#define HW_PLATFORM_H\r
+\r
+/***************************************************************************//**\r
+ * Soft-processor clock definition\r
+ * This is the only clock brought over from the Mi-V Soft processor Libero design.\r
+ */\r
+#ifndef SYS_CLK_FREQ\r
+#define SYS_CLK_FREQ                    70000000UL\r
+#endif\r
+\r
+/***************************************************************************//**\r
+ * Non-memory Peripheral base addresses\r
+ * Format of define is:\r
+ * <corename>_<instance>_BASE_ADDR\r
+ */\r
+#define COREUARTAPB0_BASE_ADDR          0x70001000UL\r
+#define COREGPIO_IN_BASE_ADDR           0x70002000UL\r
+#define CORETIMER0_BASE_ADDR            0x70003000UL\r
+#define CORETIMER1_BASE_ADDR            0x70004000UL\r
+#define COREGPIO_OUT_BASE_ADDR          0x70005000UL\r
+#define FLASH_CORE_SPI_BASE             0x70006000UL\r
+#define CORE16550_BASE_ADDR             0x70007000UL\r
+\r
+/***************************************************************************//**\r
+ * Peripheral Interrupts are mapped to the corresponding Mi-V Soft processor\r
+ * interrupt from the Libero design.\r
+ * There can be up to 31 external interrupts (IRQ[30:0] pins) on the Mi-V Soft\r
+ * processor.The Mi-V Soft processor external interrupts are defined in the\r
+ * riscv_plic.h\r
+ * These are of the form\r
+ * typedef enum\r
+{\r
+    NoInterrupt_IRQn = 0,\r
+    External_1_IRQn  = 1,\r
+    External_2_IRQn  = 2,\r
+    .\r
+    .\r
+    .\r
+    External_31_IRQn = 31\r
+} IRQn_Type;\r
\r
+ The interrupt 0 on RISC-V processor is not used. The pin IRQ[0] should map to\r
+ External_1_IRQn likewise IRQ[30] should map to External_31_IRQn\r
+ * Format of define is:\r
+ * <corename>_<instance>_<core interrupt name>\r
+ */\r
+\r
+#define TIMER0_IRQn                     External_30_IRQn\r
+#define TIMER1_IRQn                     External_31_IRQn\r
+\r
+/****************************************************************************\r
+ * Baud value to achieve a 115200 baud rate with a 83MHz system clock.\r
+ * This value is calculated using the following equation:\r
+ *      BAUD_VALUE = (CLOCK / (16 * BAUD_RATE)) - 1\r
+ *****************************************************************************/\r
+#define BAUD_VALUE_115200               (SYS_CLK_FREQ / (16 * 115200)) - 1\r
+\r
+/***************************************************************************//**\r
+ * User edit section- Edit sections below if required\r
+ */\r
+#ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
+/*\r
+ * A base address mapping for the STDIO printf/scanf mapping to CortUARTapb\r
+ * must be provided if it is being used\r
+ *\r
+ * e.g. #define MSCC_STDIO_UART_BASE_ADDR COREUARTAPB1_BASE_ADDR\r
+ */\r
+#define MSCC_STDIO_UART_BASE_ADDR COREUARTAPB0_BASE_ADDR\r
+\r
+#ifndef MSCC_STDIO_UART_BASE_ADDR\r
+#error MSCC_STDIO_UART_BASE_ADDR not defined- e.g. #define MSCC_STDIO_UART_BASE_ADDR COREUARTAPB1_BASE_ADDR\r
+#endif\r
+\r
+#ifndef MSCC_STDIO_BAUD_VALUE\r
+/*\r
+ * The MSCC_STDIO_BAUD_VALUE define should be set in your project's settings to\r
+ * specify the baud value used by the standard output CoreUARTapb instance for\r
+ * generating the UART's baud rate if you want a different baud rate from the\r
+ * default of 115200 baud\r
+ */\r
+#define MSCC_STDIO_BAUD_VALUE           115200\r
+#endif  /*MSCC_STDIO_BAUD_VALUE*/\r
+\r
+#endif  /* end of MSCC_STDIO_THRU_CORE_UART_APB */\r
+/*******************************************************************************\r
+ * End of user edit section\r
+ */\r
+#endif /* HW_PLATFORM_H */\r
+\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/main.c b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/main.c
new file mode 100644 (file)
index 0000000..59c3093
--- /dev/null
@@ -0,0 +1,185 @@
+/*\r
+ * FreeRTOS Kernel V10.1.1\r
+ * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
+ * this software and associated documentation files (the "Software"), to deal in\r
+ * the Software without restriction, including without limitation the rights to\r
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
+ * the Software, and to permit persons to whom the Software is furnished to do so,\r
+ * subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in all\r
+ * copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * http://www.FreeRTOS.org\r
+ * http://aws.amazon.com/freertos\r
+ *\r
+ * 1 tab == 4 spaces!\r
+ */\r
+\r
+/* FreeRTOS kernel includes. */\r
+#include <FreeRTOS.h>\r
+#include <task.h>\r
+\r
+/* Microsemi includes. */\r
+#include "core_uart_apb.h"\r
+#include "core_gpio.h"\r
+\r
+/******************************************************************************\r
+ * This project provides two demo applications.  A simple blinky style project,\r
+ * and a more comprehensive test and demo application.  The\r
+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting (defined in this file) is used to\r
+ * select between the two.  The simply blinky demo is implemented and described\r
+ * in main_blinky.c.  The more comprehensive test and demo application is\r
+ * implemented and described in main_full.c.\r
+ *\r
+ * This file implements the code that is not demo specific, including the\r
+ * hardware setup and standard FreeRTOS hook functions.\r
+ *\r
+ * ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON\r
+ * THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO\r
+ * APPLICATION, AND ITS ASSOCIATE FreeRTOS ARCHITECTURE PORT!\r
+ *\r
+ */\r
+\r
+/* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo,\r
+or 0 to run the more comprehensive test and demo application. */\r
+#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY     0\r
+\r
+/*\r
+ * main_blinky() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1.\r
+ * main_full() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.\r
+ */\r
+#if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1\r
+       extern void main_blinky( void );\r
+#else\r
+       extern void main_full( void );\r
+#endif /* #if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 */\r
+\r
+/* Prototypes for the standard FreeRTOS callback/hook functions implemented\r
+within this file.  See https://www.freertos.org/a00016.html */\r
+void vApplicationMallocFailedHook( void );\r
+void vApplicationIdleHook( void );\r
+void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );\r
+void vApplicationTickHook( void );\r
+\r
+/* Prepare haredware to run the demo. */\r
+static void prvSetupHardware( void );\r
+\r
+/* Send a messaage to the UART initialised in prvSetupHardware. */\r
+void vSendString( const char * const pcString );\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/* The UART to which strings are output, and the GPIO used to toggle the LED. */\r
+static UART_instance_t g_uart;\r
+static gpio_instance_t g_gpio_out;\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+int main( void )\r
+{\r
+       prvSetupHardware();\r
+\r
+       /* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top\r
+       of this file. */\r
+       #if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 )\r
+       {\r
+               main_blinky();\r
+       }\r
+       #else\r
+       {\r
+               main_full();\r
+       }\r
+       #endif\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvSetupHardware( void )\r
+{\r
+       PLIC_init();\r
+       UART_init( &g_uart, COREUARTAPB0_BASE_ADDR, BAUD_VALUE_115200, ( DATA_8_BITS | NO_PARITY ) );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vToggleLED( void )\r
+{\r
+static uint32_t ulLEDState = 0;\r
+\r
+       GPIO_set_outputs( &g_gpio_out, ulLEDState );\r
+       ulLEDState = !ulLEDState;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vSendString( const char * const pcString )\r
+{\r
+       UART_polled_tx_string( &g_uart, pcString );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vApplicationMallocFailedHook( void )\r
+{\r
+       /* vApplicationMallocFailedHook() will only be called if\r
+       configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h.  It is a hook\r
+       function that will get called if a call to pvPortMalloc() fails.\r
+       pvPortMalloc() is called internally by the kernel whenever a task, queue,\r
+       timer or semaphore is created.  It is also called by various parts of the\r
+       demo application.  If heap_1.c or heap_2.c are used, then the size of the\r
+       heap available to pvPortMalloc() is defined by configTOTAL_HEAP_SIZE in\r
+       FreeRTOSConfig.h, and the xPortGetFreeHeapSize() API function can be used\r
+       to query the size of free heap space that remains (although it does not\r
+       provide information on how the remaining heap might be fragmented). */\r
+       taskDISABLE_INTERRUPTS();\r
+       __asm volatile( "ebreak" );\r
+       for( ;; );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vApplicationIdleHook( void )\r
+{\r
+       /* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set\r
+       to 1 in FreeRTOSConfig.h.  It will be called on each iteration of the idle\r
+       task.  It is essential that code added to this hook function never attempts\r
+       to block in any way (for example, call xQueueReceive() with a block time\r
+       specified, or call vTaskDelay()).  If the application makes use of the\r
+       vTaskDelete() API function (as this demo application does) then it is also\r
+       important that vApplicationIdleHook() is permitted to return to its calling\r
+       function, because it is the responsibility of the idle task to clean up\r
+       memory allocated by the kernel to any task that has since been deleted. */\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )\r
+{\r
+       ( void ) pcTaskName;\r
+       ( void ) pxTask;\r
+\r
+       /* Run time stack overflow checking is performed if\r
+       configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2.  This hook\r
+       function is called if a stack overflow is detected. */\r
+       taskDISABLE_INTERRUPTS();\r
+       __asm volatile( "ebreak" );\r
+       for( ;; );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vApplicationTickHook( void )\r
+{\r
+       /* The tests in the full demo expect some interaction with interrupts. */\r
+       #if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY != 1 )\r
+       {\r
+               extern void vFullDemoTickHook( void );\r
+               vFullDemoTickHook();\r
+       }\r
+       #endif\r
+}\r
+\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/microsemi-riscv-renode.ld b/FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/microsemi-riscv-renode.ld
new file mode 100644 (file)
index 0000000..6b08b83
--- /dev/null
@@ -0,0 +1,139 @@
+/*******************************************************************************\r
+ * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
+ *\r
+ * file name : microsemi-riscv-ram.ld\r
+ * Mi-V soft processor linker script for creating a SoftConsole downloadable\r
+ * debug image executing in SRAM.\r
+ *\r
+ * This linker script assumes that the SRAM is connected at on the Mi-V soft\r
+ * processor memory space. The start address and size of the memory space must\r
+ * be correct as per the Libero design.\r
+ *\r
+ * SVN $Revision: 9661 $\r
+ * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
+ */\r
+\r
+OUTPUT_ARCH( "riscv" )\r
+ENTRY(_start)\r
+\r
+\r
+MEMORY\r
+{\r
+    ram (rwx) : ORIGIN = 0x80000000, LENGTH = 512k\r
+}\r
+\r
+RAM_START_ADDRESS   = 0x80000000;       /* Must be the same value MEMORY region ram ORIGIN above. */\r
+RAM_SIZE            = 512k;              /* Must be the same value MEMORY region ram LENGTH above. */\r
+STACK_SIZE          = 2k;               /* needs to be calculated for your application */\r
+HEAP_SIZE           = 4;               /* needs to be calculated for your application */\r
+\r
+SECTIONS\r
+{\r
+  .text : ALIGN(0x10)\r
+  {\r
+    KEEP (*(SORT_NONE(.text.entry)))\r
+    . = ALIGN(0x10);\r
+    *(.text .text.* .gnu.linkonce.t.*)\r
+    *(.plt)\r
+    . = ALIGN(0x10);\r
+\r
+    KEEP (*crtbegin.o(.ctors))\r
+    KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\r
+    KEEP (*(SORT(.ctors.*)))\r
+    KEEP (*crtend.o(.ctors))\r
+    KEEP (*crtbegin.o(.dtors))\r
+    KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\r
+    KEEP (*(SORT(.dtors.*)))\r
+    KEEP (*crtend.o(.dtors))\r
+\r
+    *(.rodata .rodata.* .gnu.linkonce.r.*)\r
+    *(.gcc_except_table)\r
+    *(.eh_frame_hdr)\r
+    *(.eh_frame)\r
+\r
+    KEEP (*(.init))\r
+    KEEP (*(.fini))\r
+\r
+    PROVIDE_HIDDEN (__preinit_array_start = .);\r
+    KEEP (*(.preinit_array))\r
+    PROVIDE_HIDDEN (__preinit_array_end = .);\r
+    PROVIDE_HIDDEN (__init_array_start = .);\r
+    KEEP (*(SORT(.init_array.*)))\r
+    KEEP (*(.init_array))\r
+    PROVIDE_HIDDEN (__init_array_end = .);\r
+    PROVIDE_HIDDEN (__fini_array_start = .);\r
+    KEEP (*(.fini_array))\r
+    KEEP (*(SORT(.fini_array.*)))\r
+    PROVIDE_HIDDEN (__fini_array_end = .);\r
+    . = ALIGN(0x10);\r
+\r
+  } > ram\r
+\r
+  /* short/global data section */\r
+  .sdata : ALIGN(0x10)\r
+  {\r
+    __sdata_load = LOADADDR(.sdata);\r
+    __sdata_start = .;\r
+    PROVIDE( __global_pointer$ = . + 0x800);\r
+    *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2)\r
+    *(.srodata*)\r
+    *(.sdata .sdata.* .gnu.linkonce.s.*)\r
+    . = ALIGN(0x10);\r
+    __sdata_end = .;\r
+  } > ram\r
+\r
+  /* data section */\r
+  .data : ALIGN(0x10)\r
+  {\r
+    __data_load = LOADADDR(.data);\r
+    __data_start = .;\r
+    *(.got.plt) *(.got)\r
+    *(.shdata)\r
+    *(.data .data.* .gnu.linkonce.d.*)\r
+    . = ALIGN(0x10);\r
+    __data_end = .;\r
+  } > ram\r
+\r
+  /* sbss section */\r
+  .sbss : ALIGN(0x10)\r
+  {\r
+    __sbss_start = .;\r
+    *(.sbss .sbss.* .gnu.linkonce.sb.*)\r
+    *(.scommon)\r
+    . = ALIGN(0x10);\r
+    __sbss_end = .;\r
+  } > ram\r
+\r
+  /* sbss section */\r
+  .bss : ALIGN(0x10)\r
+  {\r
+    __bss_start = .;\r
+    *(.shbss)\r
+    *(.bss .bss.* .gnu.linkonce.b.*)\r
+    *(COMMON)\r
+    . = ALIGN(0x10);\r
+    __bss_end = .;\r
+  } > ram\r
+\r
+  /* End of uninitialized data segment */\r
+  _end = .;\r
+\r
+  .heap : ALIGN(0x10)\r
+  {\r
+    __heap_start = .;\r
+    . += HEAP_SIZE;\r
+    __heap_end = .;\r
+    . = ALIGN(0x10);\r
+    _heap_end = __heap_end;\r
+  } > ram\r
+\r
+  .stack : ALIGN(0x10)\r
+  {\r
+    __stack_bottom = .;\r
+    . += STACK_SIZE;\r
+    __stack_top = .;\r
+    _sp = .;\r
+       __freertos_irq_stack_top = .;\r
+  } > ram\r
+}\r
+\r