From c41804bd2ed5ccd22e68347321fae171798468ba Mon Sep 17 00:00:00 2001 From: Achala Ram Date: Sat, 19 Aug 2023 14:43:53 +0530 Subject: [PATCH] am64x/am243: SDFM: Add trigger based normal current sampling - Add support for trigger based sampling by using IEP compare events - Add support for double update per PWM cycle - Fixed the IEP compare event hit value calculation - Tested with SDFM clock input from EPWM Fixes: PINDSW-5522, PINDSW-6544, PINDSW-6546 Signed-off-by: Achala Ram --- .metadata/.tirex/am243x.content.tirex.json | 32 + .../icss_sdfm/.project/project_am243x.js | 9 +- .../icss_sdfm/.project/project_am64x.js | 8 +- .../am243x-evm/r5fss0-0_freertos/main.c | 4 +- .../ti-arm-clang/example.projectspec | 6 +- .../r5fss0-0_freertos/ti-arm-clang/makefile | 6 +- .../r5fss0-0_freertos/example.syscfg | 132 +++ .../am243x-lp/r5fss0-0_freertos/main.c | 84 ++ .../ti-arm-clang/example.projectspec | 125 ++ .../r5fss0-0_freertos/ti-arm-clang/linker.cmd | 148 +++ .../r5fss0-0_freertos/ti-arm-clang/makefile | 314 +++++ .../ti-arm-clang/makefile_ccs_bootimage_gen | 106 ++ .../ti-arm-clang/makefile_projectspec | 20 + .../ti-arm-clang/syscfg_c.rov.xs | 8 + .../am64x-evm/r5fss0-0_freertos/main.c | 4 +- .../ti-arm-clang/example.projectspec | 6 +- .../r5fss0-0_freertos/ti-arm-clang/makefile | 6 +- .../icss_sdfm/{app_sddf.c => app_sdfm.c} | 182 ++- examples/current_sense/icss_sdfm/cfg_pad.c | 42 +- .../icss_sdfm/{sddf.c => sdfm.c} | 146 +-- .../icss_sdfm/{sddf.h => sdfm.h} | 75 +- ..._mapping.h => tisdfm_pruss_intc_mapping.h} | 0 makefile.am243x | 13 + makefile_projectspec.am243x | 13 + source/current_sense/sdfm/driver/sdfm_drv.c | 127 +-- .../sdfm/firmware/.project/project_am243x.js | 10 +- .../sdfm/firmware/.project/project_am64x.js | 10 +- .../ti-pru-cgt/example.projectspec | 10 +- .../icssg0-pru0_fw/ti-pru-cgt/makefile | 6 +- .../ti-pru-cgt/example.projectspec | 10 +- .../icssg0-pru0_fw/ti-pru-cgt/makefile | 6 +- .../current_sense/sdfm/firmware/fw_regs.asm | 103 -- .../current_sense/sdfm/firmware/icssg_pru.cmd | 4 +- .../current_sense/sdfm/firmware/icssg_sddf.h | 341 ------ .../current_sense/sdfm/firmware/icssg_sdfm.h | 328 ++++++ source/current_sense/sdfm/firmware/sddf.asm | 885 --------------- source/current_sense/sdfm/firmware/sddf_cfg.h | 119 -- source/current_sense/sdfm/firmware/sdfm.asm | 1009 +++++++++++++++++ .../sdfm/firmware/{sddf.h => sdfm.h} | 59 +- source/current_sense/sdfm/firmware/sdfm_bin.h | 404 +++---- .../firmware/{sddf_macros.h => sdfm_macros.h} | 44 +- .../sdfm/include/{sddf_api.h => sdfm_api.h} | 60 +- source/current_sense/sdfm/include/sdfm_drv.h | 45 +- 43 files changed, 3026 insertions(+), 2043 deletions(-) create mode 100644 examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/example.syscfg create mode 100644 examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/main.c create mode 100644 examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec create mode 100644 examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/linker.cmd create mode 100644 examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/makefile create mode 100644 examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/makefile_ccs_bootimage_gen create mode 100644 examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/makefile_projectspec create mode 100644 examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/syscfg_c.rov.xs rename examples/current_sense/icss_sdfm/{app_sddf.c => app_sdfm.c} (64%) rename examples/current_sense/icss_sdfm/{sddf.c => sdfm.c} (74%) rename examples/current_sense/icss_sdfm/{sddf.h => sdfm.h} (75%) rename examples/current_sense/icss_sdfm/{tisddf_pruss_intc_mapping.h => tisdfm_pruss_intc_mapping.h} (100%) delete mode 100644 source/current_sense/sdfm/firmware/fw_regs.asm delete mode 100644 source/current_sense/sdfm/firmware/icssg_sddf.h create mode 100644 source/current_sense/sdfm/firmware/icssg_sdfm.h delete mode 100644 source/current_sense/sdfm/firmware/sddf.asm delete mode 100644 source/current_sense/sdfm/firmware/sddf_cfg.h create mode 100644 source/current_sense/sdfm/firmware/sdfm.asm rename source/current_sense/sdfm/firmware/{sddf.h => sdfm.h} (85%) rename source/current_sense/sdfm/firmware/{sddf_macros.h => sdfm_macros.h} (77%) rename source/current_sense/sdfm/include/{sddf_api.h => sdfm_api.h} (87%) diff --git a/.metadata/.tirex/am243x.content.tirex.json b/.metadata/.tirex/am243x.content.tirex.json index 1abf736..95e0ba6 100644 --- a/.metadata/.tirex/am243x.content.tirex.json +++ b/.metadata/.tirex/am243x.content.tirex.json @@ -393,6 +393,38 @@ ] ] }, + { + "resourceType": "project.ccs", + "resourceClass": [ + "example" + ], + "resourceSubClass": [ + "example.general" + ], + "description": "A Icss Sdfm Example. CPU is R5FSS0-0 running FREERTOS.", + "name": "icss_sdfm", + "location": "../../examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec", + "devtools": [ + "AM243x_LAUNCHPAD" + ], + "kernel": [ + "freertos" + ], + "compiler": [ + "ticlang" + ], + "subCategories": [ + "current_sense", + "icss_sdfm", + "r5fss0-0_freertos" + ], + "mainCategories": [ + [ + "Examples", + "Development Tools" + ] + ] + }, { "resourceType": "web.page", "resourceClass": [ diff --git a/examples/current_sense/icss_sdfm/.project/project_am243x.js b/examples/current_sense/icss_sdfm/.project/project_am243x.js index 4dc4194..380d266 100644 --- a/examples/current_sense/icss_sdfm/.project/project_am243x.js +++ b/examples/current_sense/icss_sdfm/.project/project_am243x.js @@ -4,11 +4,11 @@ let device = "am243x"; const files = { common: [ - "app_sddf.c", + "app_sdfm.c", "epwm_dc.c", "epwm_drv_aux.c", "epwm_mod.c", - "sddf.c", + "sdfm.c", "cfg_pad.c", "main.c", ], @@ -39,7 +39,7 @@ const includes_freertos_r5f = { "${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/portable/TI_ARM_CLANG/ARM_CR5F", "${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/config/am243x/r5f", "${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/include", - "${MOTOR_CONTROL_SDK_PATH}/examples/icss_sdfm", + "${MOTOR_CONTROL_SDK_PATH}/examples/current_sense/icss_sdfm", ], }; @@ -73,13 +73,14 @@ const templates_freertos_r5f = input: ".project/templates/am243x/freertos/main_freertos.c.xdt", output: "../main.c", options: { - entryFunction: "sddf_main", + entryFunction: "sdfm_main", }, } ]; const buildOptionCombos = [ { device: device, cpu: "r5fss0-0", cgt: "ti-arm-clang", board: "am243x-evm", os: "freertos"}, + { device: device, cpu: "r5fss0-0", cgt: "ti-arm-clang", board: "am243x-lp", os: "freertos"}, ]; function getComponentProperty() { diff --git a/examples/current_sense/icss_sdfm/.project/project_am64x.js b/examples/current_sense/icss_sdfm/.project/project_am64x.js index 29913b5..754d44a 100644 --- a/examples/current_sense/icss_sdfm/.project/project_am64x.js +++ b/examples/current_sense/icss_sdfm/.project/project_am64x.js @@ -4,11 +4,11 @@ let device = "am64x"; const files = { common: [ - "app_sddf.c", + "app_sdfm.c", "epwm_dc.c", "epwm_drv_aux.c", "epwm_mod.c", - "sddf.c", + "sdfm.c", "cfg_pad.c", "main.c", ], @@ -39,7 +39,7 @@ const includes_freertos_r5f = { "${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/portable/TI_ARM_CLANG/ARM_CR5F", "${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/config/am64x/r5f", "${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/include", - "${MOTOR_CONTROL_SDK_PATH}/examples/icss_sdfm", + "${MOTOR_CONTROL_SDK_PATH}/examples/current_sense/icss_sdfm", ], }; @@ -74,7 +74,7 @@ const templates_freertos_r5f = input: ".project/templates/am64x/freertos/main_freertos.c.xdt", output: "../main.c", options: { - entryFunction: "sddf_main", + entryFunction: "sdfm_main", }, } ]; diff --git a/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/main.c b/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/main.c index bfe4e13..4268e23 100644 --- a/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/main.c +++ b/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/main.c @@ -45,11 +45,11 @@ StackType_t gMainTaskStack[MAIN_TASK_SIZE] __attribute__((aligned(32))); StaticTask_t gMainTaskObj; TaskHandle_t gMainTask; -void sddf_main(void *args); +void sdfm_main(void *args); void freertos_main(void *args) { - sddf_main(NULL); + sdfm_main(NULL); vTaskDelete(NULL); } diff --git a/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec b/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec index 8de01e9..28b90b0 100644 --- a/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec +++ b/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec @@ -36,7 +36,7 @@ -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/portable/TI_ARM_CLANG/ARM_CR5F -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/config/am243x/r5f -I${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/include - -I${MOTOR_CONTROL_SDK_PATH}/examples/icss_sdfm + -I${MOTOR_CONTROL_SDK_PATH}/examples/current_sense/icss_sdfm -mcpu=cortex-r5 -mfloat-abi=hard -mfpu=vfpv3-d16 @@ -96,7 +96,7 @@ " > - + @@ -104,7 +104,7 @@ - + diff --git a/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile b/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile index 246c291..ef60f6b 100644 --- a/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile +++ b/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile @@ -38,11 +38,11 @@ ifeq ($(DEVICE_TYPE), HS) endif FILES_common := \ - app_sddf.c \ + app_sdfm.c \ epwm_dc.c \ epwm_drv_aux.c \ epwm_mod.c \ - sddf.c \ + sdfm.c \ cfg_pad.c \ main.c \ ti_drivers_config.c \ @@ -66,7 +66,7 @@ INCLUDES_common := \ -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/portable/TI_ARM_CLANG/ARM_CR5F \ -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/config/am243x/r5f \ -I${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/include \ - -I${MOTOR_CONTROL_SDK_PATH}/examples/icss_sdfm \ + -I${MOTOR_CONTROL_SDK_PATH}/examples/current_sense/icss_sdfm \ -Igenerated \ DEFINES_common := \ diff --git a/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/example.syscfg b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/example.syscfg new file mode 100644 index 0000000..1d928ab --- /dev/null +++ b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/example.syscfg @@ -0,0 +1,132 @@ +/** + * These arguments were used when this file was generated. They will be automatically applied on subsequent loads + * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments. + * @cliArgs --device "AM243x_ALX_beta" --package "ALX" --part "ALX" --context "r5fss0-0" --product "MOTOR_CONTROL_SDK@09.00.00" + * @versions {"tool":"1.17.0+3128"} + */ + +/** + * Import the modules used in this configuration. + */ +const epwm = scripting.addModule("/drivers/epwm/epwm", {}, false); +const epwm1 = epwm.addInstance(); +const epwm2 = epwm.addInstance(); +const gpio = scripting.addModule("/drivers/gpio/gpio", {}, false); +const gpio1 = gpio.addInstance(); +const gpio2 = gpio.addInstance(); +const gpio3 = gpio.addInstance(); +const gpio4 = gpio.addInstance(); +const gpio5 = gpio.addInstance(); +const gpio6 = gpio.addInstance(); +const gpio7 = gpio.addInstance(); +const pruicss = scripting.addModule("/drivers/pruicss/pruicss", {}, false); +const pruicss1 = pruicss.addInstance(); +const debug_log = scripting.addModule("/kernel/dpl/debug_log"); +const mpu_armv7 = scripting.addModule("/kernel/dpl/mpu_armv7", {}, false); +const mpu_armv71 = mpu_armv7.addInstance(); +const mpu_armv72 = mpu_armv7.addInstance(); +const mpu_armv73 = mpu_armv7.addInstance(); +const mpu_armv74 = mpu_armv7.addInstance(); +const mpu_armv75 = mpu_armv7.addInstance(); + +/** + * Write custom configuration values to the imported modules. + */ +epwm1.$name = "CONFIG_EPWM0"; +epwm1.EPWM.$assign = "EHRPWM0"; +epwm1.EPWM.SYNCI.$used = false; + +epwm2.$name = "CONFIG_EPWM1"; +epwm2.EPWM.SYNCO.$assign = "GPMC0_AD1"; +epwm2.EPWM.SYNCO.$used = false; +epwm2.EPWM.SYNCI.$used = false; + +gpio1.$name = "GPIO_MTR_1_PWM_EN"; +gpio1.pinDir = "OUTPUT"; +gpio1.useMcuDomainPeripherals = true; +gpio1.MCU_GPIO.gpioPin.$assign = "MCU_UART0_RXD"; + +gpio2.pinDir = "OUTPUT"; +gpio2.$name = "GPIO_HIGH_TH_CH0"; +gpio2.GPIO.$assign = "GPIO0"; +gpio2.GPIO.gpioPin.rx = false; +gpio2.GPIO.gpioPin.$assign = "PRG1_PRU0_GPO18"; + +gpio3.$name = "GPIO_LOW_TH_CH0"; +gpio3.pinDir = "OUTPUT"; +gpio3.GPIO.gpioPin.rx = false; +gpio3.GPIO.gpioPin.$assign = "PRG0_PRU1_GPO11"; + +gpio4.pinDir = "OUTPUT"; +gpio4.$name = "GPIO_HIGH_TH_CH1"; +gpio4.GPIO.$assign = "GPIO0"; +gpio4.GPIO.gpioPin.rx = false; +gpio4.GPIO.gpioPin.$assign = "PRG1_PRU0_GPO17"; + +gpio5.$name = "GPIO_LOW_TH_CH1"; +gpio5.pinDir = "OUTPUT"; +gpio5.GPIO.$assign = "GPIO0"; +gpio5.GPIO.gpioPin.rx = false; +gpio5.GPIO.gpioPin.$assign = "PRG1_PRU0_GPO7"; + +gpio6.pinDir = "OUTPUT"; +gpio6.$name = "GPIO_HIGH_TH_CH2"; +gpio6.GPIO.gpioPin.rx = false; +gpio6.GPIO.gpioPin.$assign = "PRG0_PRU1_GPO1"; + +gpio7.$name = "GPIO_LOW_TH_CH2"; +gpio7.pinDir = "OUTPUT"; +gpio7.GPIO.gpioPin.rx = false; +gpio7.GPIO.gpioPin.$assign = "PRG0_PRU1_GPO2"; + +pruicss1.$name = "CONFIG_PRU_ICSS0"; +pruicss1.coreClk = 300000000; +pruicss1.iepClk = 300000000; +pruicss1.AdditionalICSSSettings[0].$name = "CONFIG_PRU_ICSS_IO0"; + +debug_log.enableUartLog = true; +debug_log.uartLog.$name = "CONFIG_UART_CONSOLE"; +debug_log.uartLog.UART.$assign = "USART0"; + +mpu_armv71.$name = "CONFIG_MPU_REGION0"; +mpu_armv71.size = 31; +mpu_armv71.attributes = "Device"; +mpu_armv71.accessPermissions = "Supervisor RD+WR, User RD"; +mpu_armv71.allowExecute = false; + +mpu_armv72.$name = "CONFIG_MPU_REGION1"; +mpu_armv72.size = 15; +mpu_armv72.accessPermissions = "Supervisor RD+WR, User RD"; + +mpu_armv73.$name = "CONFIG_MPU_REGION2"; +mpu_armv73.baseAddr = 0x41010000; +mpu_armv73.size = 15; +mpu_armv73.accessPermissions = "Supervisor RD+WR, User RD"; + +mpu_armv74.$name = "CONFIG_MPU_REGION3"; +mpu_armv74.accessPermissions = "Supervisor RD+WR, User RD"; +mpu_armv74.baseAddr = 0x70000000; +mpu_armv74.size = 21; + +mpu_armv75.$name = "CONFIG_MPU_REGION4"; +mpu_armv75.baseAddr = 0x60000000; +mpu_armv75.size = 28; +mpu_armv75.accessPermissions = "Supervisor RD, User RD"; + +/** + * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future + * version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to + * re-solve from scratch. + */ +epwm1.EPWM.A.$suggestSolution = "GPMC0_AD3"; +epwm1.EPWM.B.$suggestSolution = "GPMC0_AD4"; +epwm1.EPWM.SYNCO.$suggestSolution = "GPMC0_AD1"; +epwm2.EPWM.$suggestSolution = "EHRPWM1"; +epwm2.EPWM.A.$suggestSolution = "GPMC0_AD5"; +epwm2.EPWM.B.$suggestSolution = "GPMC0_AD6"; +gpio1.MCU_GPIO.$suggestSolution = "MCU_GPIO0"; +gpio3.GPIO.$suggestSolution = "GPIO1"; +gpio6.GPIO.$suggestSolution = "GPIO1"; +gpio7.GPIO.$suggestSolution = "GPIO1"; +debug_log.uartLog.UART.RXD.$suggestSolution = "UART0_RXD"; +debug_log.uartLog.UART.TXD.$suggestSolution = "UART0_TXD"; diff --git a/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/main.c b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/main.c new file mode 100644 index 0000000..4268e23 --- /dev/null +++ b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/main.c @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2018-2021 Texas Instruments Incorporated + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include "ti_drivers_config.h" +#include "ti_board_config.h" +#include "FreeRTOS.h" +#include "task.h" + +#define MAIN_TASK_PRI (configMAX_PRIORITIES-1) + +#define MAIN_TASK_SIZE (16384U/sizeof(configSTACK_DEPTH_TYPE)) +StackType_t gMainTaskStack[MAIN_TASK_SIZE] __attribute__((aligned(32))); + +StaticTask_t gMainTaskObj; +TaskHandle_t gMainTask; + +void sdfm_main(void *args); + +void freertos_main(void *args) +{ + sdfm_main(NULL); + + vTaskDelete(NULL); +} + + +int main(void) +{ + /* init SOC specific modules */ + System_init(); + Board_init(); + + /* This task is created at highest priority, it should create more tasks and then delete itself */ + gMainTask = xTaskCreateStatic( freertos_main, /* Pointer to the function that implements the task. */ + "freertos_main", /* Text name for the task. This is to facilitate debugging only. */ + MAIN_TASK_SIZE, /* Stack depth in units of StackType_t typically uint32_t on 32b CPUs */ + NULL, /* We are not using the task parameter. */ + MAIN_TASK_PRI, /* task priority, 0 is lowest priority, configMAX_PRIORITIES-1 is highest */ + gMainTaskStack, /* pointer to stack base */ + &gMainTaskObj ); /* pointer to statically allocated task object memory */ + configASSERT(gMainTask != NULL); + + /* Start the scheduler to start the tasks executing. */ + vTaskStartScheduler(); + + /* The following line should never be reached because vTaskStartScheduler() + will only return if there was not enough FreeRTOS heap memory available to + create the Idle and (if configured) Timer tasks. Heap management, and + techniques for trapping heap exhaustion, are described in the book text. */ + DebugP_assertNoLog(0); + + return 0; +} diff --git a/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec new file mode 100644 index 0000000..b7406a3 --- /dev/null +++ b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/linker.cmd b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/linker.cmd new file mode 100644 index 0000000..69640f4 --- /dev/null +++ b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/linker.cmd @@ -0,0 +1,148 @@ + +/* This is the stack that is used by code running within main() + * In case of NORTOS, + * - This means all the code outside of ISR uses this stack + * In case of FreeRTOS + * - This means all the code until vTaskStartScheduler() is called in main() + * uses this stack. + * - After vTaskStartScheduler() each task created in FreeRTOS has its own stack + */ +--stack_size=16384 +/* This is the heap size for malloc() API in NORTOS and FreeRTOS + * This is also the heap used by pvPortMalloc in FreeRTOS + */ +--heap_size=32768 +-e_vectors /* This is the entry of the application, _vector MUST be plabed starting address 0x0 */ + +/* This is the size of stack when R5 is in IRQ mode + * In NORTOS, + * - Here interrupt nesting is enabled + * - This is the stack used by ISRs registered as type IRQ + * In FreeRTOS, + * - Here interrupt nesting is disabled + * - This is stack that is used initally when a IRQ is received + * - But then the mode is switched to SVC mode and SVC stack is used for all user ISR callbacks + * - Hence in FreeRTOS, IRQ stack size is less and SVC stack size is more + */ +__IRQ_STACK_SIZE = 256; +/* This is the size of stack when R5 is in IRQ mode + * - In both NORTOS and FreeRTOS nesting is disabled for FIQ + */ +__FIQ_STACK_SIZE = 256; +__SVC_STACK_SIZE = 4096; /* This is the size of stack when R5 is in SVC mode */ +__ABORT_STACK_SIZE = 256; /* This is the size of stack when R5 is in ABORT mode */ +__UNDEFINED_STACK_SIZE = 256; /* This is the size of stack when R5 is in UNDEF mode */ + +SECTIONS +{ + /* This has the R5F entry point and vector table, this MUST be at 0x0 */ + .vectors:{} palign(8) > R5F_VECS + + /* This has the R5F boot code until MPU is enabled, this MUST be at a address < 0x80000000 + * i.e this cannot be placed in DDR + */ + GROUP { + .text.hwi: palign(8) + .text.cache: palign(8) + .text.mpu: palign(8) + .text.boot: palign(8) + .text:abort: palign(8) /* this helps in loading symbols when using XIP mode */ + } > MSRAM + + /* This is rest of code. This can be placed in DDR if DDR is available and needed */ + GROUP { + .text: {} palign(8) /* This is where code resides */ + .rodata: {} palign(8) /* This is where const's go */ + } > MSRAM + + /* This is rest of initialized data. This can be placed in DDR if DDR is available and needed */ + GROUP { + .data: {} palign(8) /* This is where initialized globals and static go */ + } > MSRAM + + /* This is rest of uninitialized data. This can be placed in DDR if DDR is available and needed */ + GROUP { + .bss: {} palign(8) /* This is where uninitialized globals go */ + RUN_START(__BSS_START) + RUN_END(__BSS_END) + .sysmem: {} palign(8) /* This is where the malloc heap goes */ + .stack: {} palign(8) /* This is where the main() stack goes */ + } > MSRAM + + /* This is where the stacks for different R5F modes go */ + GROUP { + .irqstack: {. = . + __IRQ_STACK_SIZE;} align(8) + RUN_START(__IRQ_STACK_START) + RUN_END(__IRQ_STACK_END) + .fiqstack: {. = . + __FIQ_STACK_SIZE;} align(8) + RUN_START(__FIQ_STACK_START) + RUN_END(__FIQ_STACK_END) + .svcstack: {. = . + __SVC_STACK_SIZE;} align(8) + RUN_START(__SVC_STACK_START) + RUN_END(__SVC_STACK_END) + .abortstack: {. = . + __ABORT_STACK_SIZE;} align(8) + RUN_START(__ABORT_STACK_START) + RUN_END(__ABORT_STACK_END) + .undefinedstack: {. = . + __UNDEFINED_STACK_SIZE;} align(8) + RUN_START(__UNDEFINED_STACK_START) + RUN_END(__UNDEFINED_STACK_END) + } > MSRAM + + /* Sections needed for C++ projects */ + GROUP { + .ARM.exidx: {} palign(8) /* Needed for C++ exception handling */ + .init_array: {} palign(8) /* Contains function pointers called before main */ + .fini_array: {} palign(8) /* Contains function pointers called after main */ + } > MSRAM + + /* General purpose user shared memory, used in some examples */ + .bss.user_shared_mem (NOLOAD) : {} > USER_SHM_MEM + /* this is used when Debug log's to shared memory are enabled, else this is not used */ + .bss.log_shared_mem (NOLOAD) : {} > LOG_SHM_MEM + /* this is used only when IPC RPMessage is enabled, else this is not used */ + .bss.ipc_vring_mem (NOLOAD) : {} > RTOS_NORTOS_IPC_SHM_MEM + /* General purpose non cacheable memory, used in some examples */ + .bss.nocache (NOLOAD) : {} > NON_CACHE_MEM +} + +/* +NOTE: Below memory is reserved for DMSC usage + - During Boot till security handoff is complete + 0x701E0000 - 0x701FFFFF (128KB) + - After "Security Handoff" is complete (i.e at run time) + 0x701F4000 - 0x701FFFFF (48KB) + + Security handoff is complete when this message is sent to the DMSC, + TISCI_MSG_SEC_HANDOVER + + This should be sent once all cores are loaded and all application + specific firewall calls are setup. +*/ + +MEMORY +{ + R5F_VECS : ORIGIN = 0x00000000 , LENGTH = 0x00000040 + R5F_TCMA : ORIGIN = 0x00000040 , LENGTH = 0x00007FC0 + R5F_TCMB0 : ORIGIN = 0x41010000 , LENGTH = 0x00008000 + + /* memory segment used to hold CPU specific non-cached data, MAKE to add a MPU entry to mark this as non-cached */ + NON_CACHE_MEM : ORIGIN = 0x70060000 , LENGTH = 0x8000 + + /* when using multi-core application's i.e more than one R5F/M4F active, make sure + * this memory does not overlap with other R5F's + */ + MSRAM : ORIGIN = 0x70080000 , LENGTH = 0x40000 + + /* This section can be used to put XIP section of the application in flash, make sure this does not overlap with + * other CPUs. Also make sure to add a MPU entry for this section and mark it as cached and code executable + */ + FLASH : ORIGIN = 0x60100000 , LENGTH = 0x80000 + + /* shared memory segments */ + /* On R5F, + * - make sure there is a MPU entry which maps below regions as non-cache + */ + USER_SHM_MEM : ORIGIN = 0x701D0000, LENGTH = 0x180 + LOG_SHM_MEM : ORIGIN = 0x701D0000 + 0x180, LENGTH = 0x00004000 - 0x180 + RTOS_NORTOS_IPC_SHM_MEM : ORIGIN = 0x701D4000, LENGTH = 0x0000C000 +} diff --git a/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/makefile b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/makefile new file mode 100644 index 0000000..bcd5dd3 --- /dev/null +++ b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/makefile @@ -0,0 +1,314 @@ +# +# Auto generated makefile +# + +export MOTOR_CONTROL_SDK_PATH?=$(abspath ../../../../../..) +include $(MOTOR_CONTROL_SDK_PATH)/imports.mak +include $(MOTOR_CONTROL_SDK_PATH)/devconfig/devconfig.mak + +CG_TOOL_ROOT=$(CGT_TI_ARM_CLANG_PATH) + +CC=$(CG_TOOL_ROOT)/bin/tiarmclang +LNK=$(CG_TOOL_ROOT)/bin/tiarmclang +STRIP=$(CG_TOOL_ROOT)/bin/tiarmstrip +OBJCOPY=$(CG_TOOL_ROOT)/bin/tiarmobjcopy +ifeq ($(OS), Windows_NT) + PYTHON=python +else + PYTHON=python3 +endif + +PROFILE?=release +ConfigName:=$(PROFILE) + +OUTNAME:=icss_sdfm.$(PROFILE).out + +BOOTIMAGE_PATH=$(abspath .) +BOOTIMAGE_NAME:=icss_sdfm.$(PROFILE).appimage +BOOTIMAGE_NAME_XIP:=icss_sdfm.$(PROFILE).appimage_xip +BOOTIMAGE_NAME_SIGNED:=icss_sdfm.$(PROFILE).appimage.signed +BOOTIMAGE_RPRC_NAME:=icss_sdfm.$(PROFILE).rprc +BOOTIMAGE_RPRC_NAME_XIP:=icss_sdfm.$(PROFILE).rprc_xip +BOOTIMAGE_RPRC_NAME_TMP:=icss_sdfm.$(PROFILE).rprc_tmp +BOOTIMAGE_NAME_HS:=icss_sdfm.$(PROFILE).appimage.hs +BOOTIMAGE_NAME_HS_FS:=icss_sdfm.$(PROFILE).appimage.hs_fs +TARGETS := $(BOOTIMAGE_NAME) +ifeq ($(DEVICE_TYPE), HS) + TARGETS += $(BOOTIMAGE_NAME_HS) +endif + +FILES_common := \ + app_sdfm.c \ + epwm_dc.c \ + epwm_drv_aux.c \ + epwm_mod.c \ + sdfm.c \ + cfg_pad.c \ + main.c \ + ti_drivers_config.c \ + ti_drivers_open_close.c \ + ti_board_config.c \ + ti_board_open_close.c \ + ti_dpl_config.c \ + ti_pinmux_config.c \ + ti_power_clock_config.c \ + +FILES_PATH_common = \ + .. \ + ../../.. \ + generated \ + +INCLUDES_common := \ + -I${CG_TOOL_ROOT}/include/c \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source \ + -I${MOTOR_CONTROL_SDK_PATH}/source \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/FreeRTOS-Kernel/include \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/portable/TI_ARM_CLANG/ARM_CR5F \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/config/am243x/r5f \ + -I${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/include \ + -I${MOTOR_CONTROL_SDK_PATH}/examples/current_sense/icss_sdfm \ + -Igenerated \ + +DEFINES_common := \ + -DSOC_AM243X \ + +CFLAGS_common := \ + -mcpu=cortex-r5 \ + -mfloat-abi=hard \ + -mfpu=vfpv3-d16 \ + -mthumb \ + -Wall \ + -Werror \ + -g \ + -Wno-gnu-variable-sized-type-not-at-end \ + -Wno-unused-function \ + +CFLAGS_cpp_common := \ + -Wno-c99-designator \ + -Wno-extern-c-compat \ + -Wno-c++11-narrowing \ + -Wno-reorder-init-list \ + -Wno-deprecated-register \ + -Wno-writable-strings \ + -Wno-enum-compare \ + -Wno-reserved-user-defined-literal \ + -Wno-unused-const-variable \ + -x c++ \ + +CFLAGS_debug := \ + -D_DEBUG_=1 \ + +CFLAGS_release := \ + -Os \ + +LNK_FILES_common = \ + linker.cmd \ + +LIBS_PATH_common = \ + -Wl,-i${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/lib \ + -Wl,-i${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/drivers/lib \ + -Wl,-i${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/board/lib \ + -Wl,-i${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/lib \ + -Wl,-i${CG_TOOL_ROOT}/lib \ + +LIBS_common = \ + -lfreertos.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + -ldrivers.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + -lboard.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + -lmotorcontrol_sdfm.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + -llibc.a \ + -llibsysbm.a \ + +LFLAGS_common = \ + -Wl,--diag_suppress=10063 \ + -Wl,--ram_model \ + -Wl,--reread_libs \ + + +LIBS_NAME = \ + freertos.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + drivers.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + board.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + motorcontrol_sdfm.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + libc.a \ + libsysbm.a \ + +LIBS_PATH_NAME = \ + ${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/lib \ + ${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/drivers/lib \ + ${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/board/lib \ + ${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/lib \ + ${CG_TOOL_ROOT}/lib \ + +FILES := $(FILES_common) $(FILES_$(PROFILE)) +ASMFILES := $(ASMFILES_common) $(ASMFILES_$(PROFILE)) +FILES_PATH := $(FILES_PATH_common) $(FILES_PATH_$(PROFILE)) +CFLAGS := $(CFLAGS_common) $(CFLAGS_$(PROFILE)) +DEFINES := $(DEFINES_common) $(DEFINES_$(PROFILE)) +INCLUDES := $(INCLUDES_common) $(INCLUDE_$(PROFILE)) +LIBS := $(LIBS_common) $(LIBS_$(PROFILE)) +LIBS_PATH := $(LIBS_PATH_common) $(LIBS_PATH_$(PROFILE)) +LFLAGS := $(LFLAGS_common) $(LFLAGS_$(PROFILE)) +LNKOPTFLAGS := $(LNKOPTFLAGS_common) $(LNKOPTFLAGS_$(PROFILE)) +LNK_FILES := $(LNK_FILES_common) $(LNK_FILES_$(PROFILE)) + +OBJDIR := obj/$(PROFILE)/ +OBJS := $(FILES:%.c=%.obj) +OBJS += $(ASMFILES:%.S=%.obj) +DEPS := $(FILES:%.c=%.d) + +vpath %.obj $(OBJDIR) +vpath %.c $(FILES_PATH) +vpath %.S $(FILES_PATH) +vpath %.lib $(LIBS_PATH_NAME) +vpath %.a $(LIBS_PATH_NAME) + +$(OBJDIR)/%.obj %.obj: %.c + @echo Compiling: am243x:r5fss0-0:freertos:ti-arm-clang $(OUTNAME): $< + $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) -MMD -o $(OBJDIR)/$@ $< + +$(OBJDIR)/%.obj %.obj: %.S + @echo Compiling: am243x:r5fss0-0:freertos:ti-arm-clang $(LIBNAME): $< + $(CC) -c $(CFLAGS) -o $(OBJDIR)/$@ $< + +all: $(TARGETS) + +SYSCFG_GEN_FILES=generated/ti_drivers_config.c generated/ti_drivers_config.h +SYSCFG_GEN_FILES+=generated/ti_drivers_open_close.c generated/ti_drivers_open_close.h +SYSCFG_GEN_FILES+=generated/ti_dpl_config.c generated/ti_dpl_config.h +SYSCFG_GEN_FILES+=generated/ti_pinmux_config.c generated/ti_power_clock_config.c +SYSCFG_GEN_FILES+=generated/ti_board_config.c generated/ti_board_config.h +SYSCFG_GEN_FILES+=generated/ti_board_open_close.c generated/ti_board_open_close.h + +$(OUTNAME): syscfg $(SYSCFG_GEN_FILES) $(OBJS) $(LNK_FILES) $(LIBS_NAME) + @echo . + @echo Linking: am243x:r5fss0-0:freertos:ti-arm-clang $@ ... + $(LNK) $(LNKOPTFLAGS) $(LFLAGS) $(LIBS_PATH) -Wl,-m=$(basename $@).map -o $@ $(addprefix $(OBJDIR), $(OBJS)) $(LIBS) $(LNK_FILES) + @echo Linking: am243x:r5fss0-0:freertos:ti-arm-clang $@ Done !!! + @echo . + +clean: + @echo Cleaning: am243x:r5fss0-0:freertos:ti-arm-clang $(OUTNAME) ... + $(RMDIR) $(OBJDIR) + $(RM) $(OUTNAME) + $(RM) $(BOOTIMAGE_NAME) + $(RM) $(BOOTIMAGE_NAME_XIP) + $(RM) $(BOOTIMAGE_NAME_SIGNED) + $(RM) $(BOOTIMAGE_NAME_HS) + $(RM) $(BOOTIMAGE_NAME_HS_FS) + $(RM) $(BOOTIMAGE_RPRC_NAME) + $(RM) $(BOOTIMAGE_RPRC_NAME_XIP) + $(RMDIR) generated/ + +scrub: + @echo Scrubing: am243x:r5fss0-0:freertos:ti-arm-clang icss_sdfm ... + $(RMDIR) obj +ifeq ($(OS),Windows_NT) + $(RM) \*.out + $(RM) \*.map + $(RM) \*.appimage* + $(RM) \*.rprc* + $(RM) \*.tiimage* + $(RM) \*.bin +else + $(RM) *.out + $(RM) *.map + $(RM) *.appimage* + $(RM) *.rprc* + $(RM) *.tiimage* + $(RM) *.bin +endif + $(RMDIR) generated + +$(OBJS): | $(OBJDIR) + +$(OBJDIR): + $(MKDIR) $@ + + +.NOTPARALLEL: + +.INTERMEDIATE: syscfg +$(SYSCFG_GEN_FILES): syscfg + +syscfg: ../example.syscfg + @echo Generating SysConfig files ... + $(SYSCFG_NODE) $(SYSCFG_CLI_PATH)/dist/cli.js --product $(SYSCFG_SDKPRODUCT) --context r5fss0-0 --part ALX --package ALX --output generated/ ../example.syscfg + +syscfg-gui: + $(SYSCFG_NWJS) $(SYSCFG_PATH) --product $(SYSCFG_SDKPRODUCT) --device AM243x_ALX_beta --context r5fss0-0 --part ALX --package ALX --output generated/ ../example.syscfg + +# +# Generation of boot image which can be loaded by Secondary Boot Loader (SBL) +# +ifeq ($(OS),Windows_NT) +EXE_EXT=.exe +endif +ifeq ($(OS),Windows_NT) + BOOTIMAGE_CERT_GEN_CMD=powershell -executionpolicy unrestricted -command $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/x509CertificateGen.ps1 +else + BOOTIMAGE_CERT_GEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/x509CertificateGen.sh +endif +BOOTIMAGE_TEMP_OUT_FILE=temp_stdout_$(PROFILE).txt + +BOOTIMAGE_CERT_KEY=$(APP_SIGNING_KEY) + +BOOTIMAGE_CORE_ID_r5fss0-0 = 4 +BOOTIMAGE_CORE_ID_r5fss0-1 = 5 +BOOTIMAGE_CORE_ID_r5fss1-0 = 6 +BOOTIMAGE_CORE_ID_r5fss1-1 = 7 +BOOTIMAGE_CORE_ID_m4fss0-0 = 14 +SBL_RUN_ADDRESS=0x70000000 +SBL_DEV_ID=55 + +MULTI_CORE_IMAGE_GEN = $(SYSCFG_NODE) $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/multicoreImageGen/multicoreImageGen.js +OUTRPRC_CMD = $(SYSCFG_NODE) $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/out2rprc/elf2rprc.js +APP_IMAGE_SIGN_CMD = $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/appimage_x509_cert_gen.py + +ifeq ($(OS),Windows_NT) + XIPGEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/xipGen/xipGen.exe +else + XIPGEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/xipGen/xipGen.out +endif + +MULTI_CORE_IMAGE_PARAMS = \ + $(BOOTIMAGE_RPRC_NAME)@$(BOOTIMAGE_CORE_ID_r5fss0-0) \ + +MULTI_CORE_IMAGE_PARAMS_XIP = \ + $(BOOTIMAGE_RPRC_NAME_XIP)@$(BOOTIMAGE_CORE_ID_r5fss0-0) \ + +$(BOOTIMAGE_NAME): $(OUTNAME) + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_PATH)/$@ ... +ifneq ($(OS),Windows_NT) + $(CHMOD) a+x $(XIPGEN_CMD) +endif + $(OUTRPRC_CMD) $(OUTNAME) >> $(BOOTIMAGE_TEMP_OUT_FILE) + $(COPY) $(BOOTIMAGE_RPRC_NAME) $(BOOTIMAGE_RPRC_NAME_TMP) + $(RM) $(BOOTIMAGE_RPRC_NAME) + $(XIPGEN_CMD) -i $(BOOTIMAGE_RPRC_NAME_TMP) -o $(BOOTIMAGE_RPRC_NAME) -x $(BOOTIMAGE_RPRC_NAME_XIP) --flash-start-addr 0x60000000 -v > $(BOOTIMAGE_TEMP_OUT_FILE) + $(MULTI_CORE_IMAGE_GEN) --devID $(SBL_DEV_ID) --out $(BOOTIMAGE_NAME) $(MULTI_CORE_IMAGE_PARAMS) >> $(BOOTIMAGE_TEMP_OUT_FILE) + $(MULTI_CORE_IMAGE_GEN) --devID $(SBL_DEV_ID) --out $(BOOTIMAGE_NAME_XIP) $(MULTI_CORE_IMAGE_PARAMS_XIP) >> $(BOOTIMAGE_TEMP_OUT_FILE) +# Sign the appimage for HS-FS using appimage signing script + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --output $(BOOTIMAGE_NAME_HS_FS) + $(RM) $(BOOTIMAGE_RPRC_NAME_TMP) + $(RM) $(BOOTIMAGE_TEMP_OUT_FILE) + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_PATH)/$@ Done !!! + @echo . + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_PATH)/$(BOOTIMAGE_NAME_HS_FS) Done !!! + @echo . + +$(BOOTIMAGE_NAME_HS): $(BOOTIMAGE_NAME) +ifeq ($(DEVICE_TYPE), HS) +# Sign the appimage using appimage signing script +ifeq ($(ENC_ENABLED),no) + @echo Boot image signing: Encryption is disabled. + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --output $(BOOTIMAGE_NAME_HS) +else + @echo Boot image signing: Encryption is enabled. + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --enc y --enckey $(APP_ENCRYPTION_KEY) --output $(BOOTIMAGE_NAME_HS) + $(RM) $(BOOTIMAGE_NAME)-enc +endif + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_PATH)/$(BOOTIMAGE_NAME_HS) Done !!! + @echo . +endif +-include $(addprefix $(OBJDIR)/, $(DEPS)) diff --git a/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/makefile_ccs_bootimage_gen b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/makefile_ccs_bootimage_gen new file mode 100644 index 0000000..8666cfd --- /dev/null +++ b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/makefile_ccs_bootimage_gen @@ -0,0 +1,106 @@ +# +# Auto generated makefile +# + +# Below variables need to be defined outside this file or via command line +# - MOTOR_CONTROL_SDK_PATH +# - PROFILE +# - CG_TOOL_ROOT +# - OUTNAME +# - CCS_INSTALL_DIR +# - CCS_IDE_MODE + +CCS_PATH=$(CCS_INSTALL_DIR) +include ${MOTOR_CONTROL_SDK_PATH}/imports.mak +include ${MOTOR_CONTROL_SDK_PATH}/devconfig/devconfig.mak + +STRIP=$(CG_TOOL_ROOT)/bin/tiarmstrip +OBJCOPY=$(CG_TOOL_ROOT)/bin/tiarmobjcopy +ifeq ($(OS), Windows_NT) + PYTHON=python +else + PYTHON=python3 +endif + +OUTFILE=$(PROFILE)/$(OUTNAME).out +BOOTIMAGE_PATH=$(abspath ${PROFILE}) +BOOTIMAGE_NAME:=$(BOOTIMAGE_PATH)/$(OUTNAME).appimage +BOOTIMAGE_NAME_XIP:=$(BOOTIMAGE_PATH)/$(OUTNAME).appimage_xip +BOOTIMAGE_NAME_SIGNED:=$(BOOTIMAGE_PATH)/$(OUTNAME).appimage.signed +BOOTIMAGE_RPRC_NAME:=$(BOOTIMAGE_PATH)/$(OUTNAME).rprc +BOOTIMAGE_RPRC_NAME_XIP:=$(BOOTIMAGE_PATH)/$(OUTNAME).rprc_xip +BOOTIMAGE_RPRC_NAME_TMP:=$(BOOTIMAGE_PATH)/$(OUTNAME).rprc_tmp + +# +# Generation of boot image which can be loaded by Secondary Boot Loader (SBL) +# +ifeq ($(OS),Windows_NT) +EXE_EXT=.exe +endif +ifeq ($(OS),Windows_NT) + BOOTIMAGE_CERT_GEN_CMD=powershell -executionpolicy unrestricted -command $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/x509CertificateGen.ps1 +else + BOOTIMAGE_CERT_GEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/x509CertificateGen.sh +endif +BOOTIMAGE_TEMP_OUT_FILE=$(PROFILE)/temp_stdout_$(PROFILE).txt + +BOOTIMAGE_CORE_ID_r5fss0-0 = 4 +BOOTIMAGE_CORE_ID_r5fss0-1 = 5 +BOOTIMAGE_CORE_ID_r5fss1-0 = 6 +BOOTIMAGE_CORE_ID_r5fss1-1 = 7 +BOOTIMAGE_CORE_ID_m4fss0-0 = 14 +SBL_RUN_ADDRESS=0x70000000 +SBL_DEV_ID=55 + +MULTI_CORE_IMAGE_GEN = $(CCS_NODE) $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/multicoreImageGen/multicoreImageGen.js +OUTRPRC_CMD = $(CCS_NODE) $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/out2rprc/elf2rprc.js +APP_IMAGE_SIGN_CMD = $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/appimage_x509_cert_gen.py + +ifeq ($(OS),Windows_NT) + XIPGEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/xipGen/xipGen.exe +else + XIPGEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/xipGen/xipGen.out +endif + +MULTI_CORE_IMAGE_PARAMS = \ + $(BOOTIMAGE_RPRC_NAME)@$(BOOTIMAGE_CORE_ID_r5fss0-0) \ + +MULTI_CORE_IMAGE_PARAMS_XIP = \ + $(BOOTIMAGE_RPRC_NAME_XIP)@$(BOOTIMAGE_CORE_ID_r5fss0-0) \ + +all: +ifeq ($(CCS_IDE_MODE),cloud) +# No post build steps +else + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_NAME) ... + $(OUTRPRC_CMD) $(OUTFILE) >> $(BOOTIMAGE_TEMP_OUT_FILE) + $(COPY) $(OUTNAME).rprc $(BOOTIMAGE_RPRC_NAME) + $(COPY) $(BOOTIMAGE_RPRC_NAME) $(BOOTIMAGE_RPRC_NAME_TMP) + $(RM) $(BOOTIMAGE_RPRC_NAME) + $(XIPGEN_CMD) -i $(BOOTIMAGE_RPRC_NAME_TMP) -o $(BOOTIMAGE_RPRC_NAME) -x $(BOOTIMAGE_RPRC_NAME_XIP) --flash-start-addr 0x60000000 -v > $(BOOTIMAGE_TEMP_OUT_FILE) + $(MULTI_CORE_IMAGE_GEN) --devID $(SBL_DEV_ID) --out $(BOOTIMAGE_NAME) $(MULTI_CORE_IMAGE_PARAMS) >> $(BOOTIMAGE_TEMP_OUT_FILE) + $(MULTI_CORE_IMAGE_GEN) --devID $(SBL_DEV_ID) --out $(BOOTIMAGE_NAME_XIP) $(MULTI_CORE_IMAGE_PARAMS_XIP) >> $(BOOTIMAGE_TEMP_OUT_FILE) +# Sign the appimage for HS-FS using appimage signing script + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --output $(BOOTIMAGE_NAME).hs_fs +ifeq ($(DEVICE_TYPE),HS) +# Sign the appimage using appimage signing script +ifeq ($(ENC_ENABLED),no) + @echo Boot image signing: Encryption is disabled. + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --output $(BOOTIMAGE_NAME).hs +else + @echo Boot image signing: Encryption is enabled. + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --enc y --enckey $(APP_ENCRYPTION_KEY) --output $(BOOTIMAGE_NAME).hs + $(RM) $(BOOTIMAGE_NAME)-enc +endif +endif + $(RM) $(BOOTIMAGE_RPRC_NAME_TMP) + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_NAME) Done !!! + @echo . +ifeq ($(DEVICE_TYPE),HS) + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_NAME).hs Done !!! + @echo . +else + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_NAME).hs_fs Done !!! + @echo . +endif +endif diff --git a/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/makefile_projectspec b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/makefile_projectspec new file mode 100644 index 0000000..b8eb5d7 --- /dev/null +++ b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/makefile_projectspec @@ -0,0 +1,20 @@ +# +# Auto generated makefile +# + +export MOTOR_CONTROL_SDK_PATH?=$(abspath ../../../../../..) +include $(MOTOR_CONTROL_SDK_PATH)/imports.mak + +PROFILE?=Release + +PROJECT_NAME=icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang + +all: + $(CCS_ECLIPSE) -noSplash -data $(MOTOR_CONTROL_SDK_PATH)/ccs_projects -application com.ti.ccstudio.apps.projectBuild -ccs.projects $(PROJECT_NAME) -ccs.configuration $(PROFILE) + +clean: + $(CCS_ECLIPSE) -noSplash -data $(MOTOR_CONTROL_SDK_PATH)/ccs_projects -application com.ti.ccstudio.apps.projectBuild -ccs.projects $(PROJECT_NAME) -ccs.configuration $(PROFILE) -ccs.clean + +export: + $(MKDIR) $(MOTOR_CONTROL_SDK_PATH)/ccs_projects + $(CCS_ECLIPSE) -noSplash -data $(MOTOR_CONTROL_SDK_PATH)/ccs_projects -application com.ti.ccstudio.apps.projectCreate -ccs.projectSpec example.projectspec -ccs.overwrite full diff --git a/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/syscfg_c.rov.xs b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/syscfg_c.rov.xs new file mode 100644 index 0000000..472ab38 --- /dev/null +++ b/examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang/syscfg_c.rov.xs @@ -0,0 +1,8 @@ +/* + * ======== syscfg_c.rov.xs ======== + * This file contains the information needed by the Runtime Object + * View (ROV) tool. + */ +var crovFiles = [ + "kernel/freertos/rov/FreeRTOS.rov.js", +]; diff --git a/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/main.c b/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/main.c index bfe4e13..4268e23 100644 --- a/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/main.c +++ b/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/main.c @@ -45,11 +45,11 @@ StackType_t gMainTaskStack[MAIN_TASK_SIZE] __attribute__((aligned(32))); StaticTask_t gMainTaskObj; TaskHandle_t gMainTask; -void sddf_main(void *args); +void sdfm_main(void *args); void freertos_main(void *args) { - sddf_main(NULL); + sdfm_main(NULL); vTaskDelete(NULL); } diff --git a/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec b/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec index be53cad..95e6e73 100644 --- a/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec +++ b/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec @@ -36,7 +36,7 @@ -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/portable/TI_ARM_CLANG/ARM_CR5F -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/config/am64x/r5f -I${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/include - -I${MOTOR_CONTROL_SDK_PATH}/examples/icss_sdfm + -I${MOTOR_CONTROL_SDK_PATH}/examples/current_sense/icss_sdfm -mcpu=cortex-r5 -mfloat-abi=hard -mfpu=vfpv3-d16 @@ -96,7 +96,7 @@ " > - + @@ -104,7 +104,7 @@ - + diff --git a/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile b/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile index 1bf01db..b4e06ff 100644 --- a/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile +++ b/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile @@ -38,11 +38,11 @@ ifeq ($(DEVICE_TYPE), HS) endif FILES_common := \ - app_sddf.c \ + app_sdfm.c \ epwm_dc.c \ epwm_drv_aux.c \ epwm_mod.c \ - sddf.c \ + sdfm.c \ cfg_pad.c \ main.c \ ti_drivers_config.c \ @@ -66,7 +66,7 @@ INCLUDES_common := \ -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/portable/TI_ARM_CLANG/ARM_CR5F \ -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/config/am64x/r5f \ -I${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/include \ - -I${MOTOR_CONTROL_SDK_PATH}/examples/icss_sdfm \ + -I${MOTOR_CONTROL_SDK_PATH}/examples/current_sense/icss_sdfm \ -Igenerated \ DEFINES_common := \ diff --git a/examples/current_sense/icss_sdfm/app_sddf.c b/examples/current_sense/icss_sdfm/app_sdfm.c similarity index 64% rename from examples/current_sense/icss_sdfm/app_sddf.c rename to examples/current_sense/icss_sdfm/app_sdfm.c index 4a5a16e..a250d6c 100644 --- a/examples/current_sense/icss_sdfm/app_sddf.c +++ b/examples/current_sense/icss_sdfm/app_sdfm.c @@ -41,8 +41,10 @@ #include "epwm_dc.h" #include "cfg_pad.h" -#include "sddf.h" +#include "sdfm.h" +/*EPWM1 configuration for sigma delta clock generation: */ +#define APP_EPWM1_ENABLE 0 /*make sure EPWM1 is added in sysconfig before making true this macro */ /* Output channel - A or B */ #define APP_EPWM_OUT_CH_EN ( 0x1 ) /* ChA enabled */ @@ -73,7 +75,9 @@ #define APP_EPWM_OUTPUT_FREQ ( APP_EPWM_OUTPUT_FREQ_8K ) /* init freq */ /*sample Read time */ -#define SAMPLE_READ_TIME ((float)(1000000/(2*APP_EPWM_OUTPUT_FREQ))) //Middle of PWM loop +#define FIRST_SAMPLE_TRIGGER_TIME ((float)((float)1000000/(4*APP_EPWM_OUTPUT_FREQ))) /*sample trigger time for Single Update */ + +#define SECOND_SAMPLE_TRIGGER_TIME ((float)((float)3000000/(4*APP_EPWM_OUTPUT_FREQ))) /*Sample trigger time for double update*/ /* PWM count direction (Up, Down, Up/Down) */ #define APP_EPWM_TB_COUNTER_DIR ( EPWM_TB_COUNTER_DIR_UP_DOWN ) @@ -87,47 +91,72 @@ #define TEST_RTU_INST_ID ( PRUICSS_RTU_PRU0 ) /* R5F interrupt settings for ICSSG */ -#define ICSSG_PRU_SDDF_INT_NUM ( CSLR_R5FSS0_CORE0_INTR_PRU_ICSSG0_PR1_HOST_INTR_PEND_0 ) /* VIM interrupt number */ -#define ICSSG_RTU_SDDF_INT_NUM ( CSLR_R5FSS0_CORE0_INTR_PRU_ICSSG0_PR1_HOST_INTR_PEND_1 ) /* VIM interrupt number */ +#define ICSSG_PRU_SDFM_INT_NUM ( CSLR_R5FSS0_CORE0_INTR_PRU_ICSSG0_PR1_HOST_INTR_PEND_0 ) /* VIM interrupt number */ +#define ICSSG_RTU_SDFM_INT_NUM ( CSLR_R5FSS0_CORE0_INTR_PRU_ICSSG0_PR1_HOST_INTR_PEND_1 ) /* VIM interrupt number */ /* EPWM0 IRQ handler */ static void epwmIrqHandler(void *handle); +/* EPWM1 IRQ handler */ +static void epwmIrqHandler1(void *handle); + /* HWI global variables */ -static HwiP_Object gIcssgPruSddfHwiObject; /* ICSSG PRU SDDF FW HWI */ -//static HwiP_Object gIcssgRtuSddfHwiObject; /* ICSSG RTU SDDF FW HWI */ +static HwiP_Object gIcssgPruSdfmHwiObject; /* ICSSG PRU SDFM FW HWI */ + +#if APP_EPWM1_ENABLE +#define APP_EPWM_OUTPUT_FREQ1 (1U*20000000 ) +static HwiP_Object gIcssgRtuSDFMHwiObject; /* ICSSG RTU SDFM FW HWI */ + +static HwiP_Object gEpwm1HwiObject; /* EPWM1 HWI */ + +uint32_t gEpwm1BaseAddr; /* EPWM1 base address */ +EPwmObj_t gEpwm1Obj; /* EPWM1 object */ +Epwm_Handle hEpwm1; /* EPWM1 handle */ + +volatile uint32_t gEpwmOutFreq1 = APP_EPWM_OUTPUT_FREQ1; /*EPWM1 output freq. */ + +#endif + static HwiP_Object gEpwm0HwiObject; /* EPWM0 HWI */ /* EPWM global variables */ uint32_t gEpwm0BaseAddr; /* EPWM0 base address */ EPwmObj_t gEpwm0Obj; /* EPWM0 object */ Epwm_Handle hEpwm0; /* EPWM0 handle */ + + + volatile uint32_t gEpwmOutFreq = APP_EPWM_OUTPUT_FREQ; /* EPWM output frequency */ -/* ICSSG PRU SDDF FW IRQ handler */ -static void pruSddfIrqHandler(void *handle); + +/* ICSSG PRU SDFM FW IRQ handler */ +static void pruSdfmIrqHandler(void *handle); /* Test ICSSG handle */ PRUICSS_Handle gPruIcssHandle; -/* Test SDDF handles */ -sdfm_handle gHPruSddf; +/* Test Sdfm handles */ +sdfm_handle gHPruSdfm; -/* Test SDDF parameters */ -SddfPrms gTestSddfPrms = { - SAMPLE_READ_TIME, // trigSampTime in us; always middel of PWM cycle - APP_EPWM_OUTPUT_FREQ, // PWM output frequency - {{3500,2500,0}, //threshold parameters(High, low & reserevd) - {3500,2500,0}, - {3500,2500,0}}, - {{0,0}, //clock sourse & clock inversion for all channels +/* Test Sdfm parameters */ +SdfmPrms gTestSdfmPrms = { + 300000000, /*Value of IEP clock*/ + 20000000, /*Value of SD clock (It should be exact equal to sd clock value)*/ + 0, /*enable double update*/ + FIRST_SAMPLE_TRIGGER_TIME, /*first sample trigger time*/ + SECOND_SAMPLE_TRIGGER_TIME, /*second sample trigger time*/ + APP_EPWM_OUTPUT_FREQ, /*PWM output frequency*/ + {{3500, 1000,0}, /*threshold parameters(High, low & reserevd)*/ + {3500, 1000,0}, + {3500, 1000,0}}, + {{0,0}, /*clock sourse & clock inversion for all channels*/ {0,0}, {0,0}}, - 32, //OC osr - 64, //NC osr - 1 //comparator enable + 15, /*Over current osr: The effect count is OSR + 1*/ + 128, /*Normal current osr */ + 1 /*comparator enable*/ }; #define PRUICSS_G_MUX_EN ( 0x1 ) /* ICSSG_SA_MX_REG:G_MUX_EN */ @@ -155,12 +184,14 @@ uint32_t sdfm_ch2_idx = 0; /* IRQ counters */ -volatile uint32_t gPruSddfIrqCnt=0; /* PRU SDDF FW IRQ count */ +volatile uint32_t gPruSdfmIrqCnt=0; /* PRU Sdfm FW IRQ count */ volatile uint32_t gEpwmIsrCnt=0; /* EPWM0 IRQ count */ - +volatile uint32_t gEpwmIsrCnt1=0; /*PWM Parameters*/ HwiP_Params hwiPrms; +HwiP_Params hwiPrms1; EPwmCfgPrms_t epwmCfgPrms; +EPwmCfgPrms_t epwm1CfgPrms; void init_pwm() { @@ -206,6 +237,46 @@ void init_pwm() hEpwm0 = epwmInit(&epwmCfgPrms, &gEpwm0Obj); DebugP_assert(hEpwm0 != NULL); +#if APP_EPWM1_ENABLE // DEBUG code for SDFM clock generation from EPWM1 + /* EPWM1 for SD clock generation */ + /* Initialize EPWM1 base address, perform address translation */ + gEpwm1BaseAddr = (uint32_t)AddrTranslateP_getLocalAddr(CONFIG_EPWM1_BASE_ADDR); + /* Register & enable EPWM0 interrupt */ + HwiP_Params_init(&hwiPrms1); + hwiPrms1.intNum = CONFIG_EPWM1_INTR; + hwiPrms1.callback = &epwmIrqHandler1; + hwiPrms1.args = 0; + hwiPrms1.isPulse = CONFIG_EPWM1_INTR_IS_PULSE; + hwiPrms1.isFIQ = FALSE; + status = HwiP_construct(&gEpwm1HwiObject, &hwiPrms1); + DebugP_assert(status == SystemP_SUCCESS); + /* Configure EPWM0 */ + epwm1CfgPrms.epwmId = EPWM_ID_1; + epwm1CfgPrms.epwmBaseAddr = gEpwm1BaseAddr; + epwm1CfgPrms.epwmOutChEn = APP_EPWM_OUT_CH_EN; + epwm1CfgPrms.hspClkDiv = APP_EPWM_FCLK_HSPCLKDIV; + epwm1CfgPrms.clkDiv = APP_EPWM_FCLK_CLKDIV; + epwm1CfgPrms.epwmTbFreq = APP_EPWM_TB_FREQ; + epwm1CfgPrms.epwmOutFreq = gEpwmOutFreq1; + epwm1CfgPrms.epwmDutyCycle[EPWM_OUTPUT_CH_A] = APP_EPWM0_DUTY_CYCLE; + epwm1CfgPrms.epwmTbCounterDir = APP_EPWM_TB_COUNTER_DIR; + epwm1CfgPrms.cfgTbSyncIn = FALSE; + epwm1CfgPrms.tbPhsValue = 0; + epwm1CfgPrms.cfgTbSyncOut = FALSE; + epwm1CfgPrms.tbSyncOutMode = EPWM_TB_SYNC_OUT_EVT_CNT_EQ_ZERO; + epwm1CfgPrms.aqCfg[EPWM_OUTPUT_CH_A].zeroAction = EPWM_AQ_ACTION_DONOTHING; + epwm1CfgPrms.aqCfg[EPWM_OUTPUT_CH_A].prdAction = EPWM_AQ_ACTION_DONOTHING; + epwm1CfgPrms.aqCfg[EPWM_OUTPUT_CH_A].cmpAUpAction = EPWM_AQ_ACTION_HIGH; + epwm1CfgPrms.aqCfg[EPWM_OUTPUT_CH_A].cmpADownAction = EPWM_AQ_ACTION_LOW; + epwm1CfgPrms.aqCfg[EPWM_OUTPUT_CH_A].cmpBUpAction = EPWM_AQ_ACTION_DONOTHING; + epwm1CfgPrms.aqCfg[EPWM_OUTPUT_CH_A].cmpBDownAction = EPWM_AQ_ACTION_DONOTHING; + epwm1CfgPrms.cfgDb = FALSE; + epwm1CfgPrms.cfgEt = FALSE; + epwm1CfgPrms.intSel = EPWM_ET_INTR_EVT_CNT_EQ_ZRO; + epwm1CfgPrms.intPrd = EPWM_ET_INTR_PERIOD_FIRST_EVT; + hEpwm1 = epwmInit(&epwm1CfgPrms, &gEpwm1Obj); + DebugP_assert(hEpwm1 != NULL); +#endif } void init_sdfm() @@ -213,30 +284,31 @@ void init_sdfm() int32_t status; /* Initialize ICSSG */ status = initIcss(TEST_ICSSG_INST_ID, TEST_ICSSG_SLICE_ID, PRUICSS_G_MUX_EN, &gPruIcssHandle); - if (status != SDDF_ERR_NERR) { + if (status != SDFM_ERR_NERR) { DebugP_log("Error: initIcss() fail.\r\n"); return; } - /* Register & enable ICSSG PRU SDDF FW interrupt */ + /* Register & enable ICSSG PRU SDFM FW interrupt */ HwiP_Params_init(&hwiPrms); - hwiPrms.intNum = ICSSG_PRU_SDDF_INT_NUM; - hwiPrms.callback = &pruSddfIrqHandler; + hwiPrms.intNum = ICSSG_PRU_SDFM_INT_NUM; + hwiPrms.callback = &pruSdfmIrqHandler; hwiPrms.args = 0; hwiPrms.isPulse = FALSE; hwiPrms.isFIQ = FALSE; - status = HwiP_construct(&gIcssgPruSddfHwiObject, &hwiPrms); + status = HwiP_construct(&gIcssgPruSdfmHwiObject, &hwiPrms); DebugP_assert(status == SystemP_SUCCESS); - /* Initialize PRU core for SDDF */ - status = initPruSddf(gPruIcssHandle, TEST_PRU_INST_ID, &gTestSddfPrms, &gHPruSddf); - if (status != SDDF_ERR_NERR) { - DebugP_log("Error: initPruSddf() fail.\r\n"); + /* Initialize PRU core for SDFM */ + status = initPruSdfm(gPruIcssHandle, TEST_PRU_INST_ID, &gTestSdfmPrms, &gHPruSdfm); + if (status != SDFM_ERR_NERR) + { + DebugP_log("Error: initPruSdfm() fail.\r\n"); return; } } -void sddf_main(void *args) +void sdfm_main(void *args) { /* Open drivers to open the UART driver for console */ @@ -260,10 +332,10 @@ void sddf_main(void *args) init_pwm(); DebugP_log("EPWM Configured!\r\n"); /* - * Configure SDDF + * Configure SDFM */ - /* Configure SOC pads for SDDF. + /* Configure SOC pads for SDFM. Normally handled via Pinmux_init(), but currently no way to pads for ICSSG from Sysconfig. */ cfgPad(); @@ -290,11 +362,8 @@ void sddf_main(void *args) /* Destroy EPWM0 HWI */ HwiP_destruct(&gEpwm0HwiObject); - /* Destroy PRU SDDF HWI */ - HwiP_destruct(&gIcssgPruSddfHwiObject); - - /* Destroy RTU SDDF HWI */ - //HwiP_destruct(&gIcssgRtuSddfHwiObject); + /* Destroy PRU SDFM HWI */ + HwiP_destruct(&gIcssgPruSdfmHwiObject); DebugP_log("All tests have passed!!\r\n"); @@ -302,17 +371,17 @@ void sddf_main(void *args) Drivers_close(); } -/* PRU SDDF FW IRQ handler */ -void pruSddfIrqHandler(void *args) +/* PRU SDFM FW IRQ handler */ +void pruSdfmIrqHandler(void *args) { - /* debug, inncrement PRU SDDF IRQ count */ - gPruSddfIrqCnt++; + /* debug, inncrement PRU SDFM IRQ count */ + gPruSdfmIrqCnt++; /* Clear interrupt at source */ /* Write 18 to ICSSG_STATUS_CLR_INDEX_REG - Firmware: TRIGGER_HOST_SDDF_IRQ defined as 18 + Firmware: TRIGGER_HOST_SDFM_IRQ defined as 18 18 = 16+2, 2 is Host Interrupt Number. See AM64x TRM. */ - PRUICSS_clearEvent(gPruIcssHandle, PRU_TRIGGER_HOST_SDDF_EVT); + PRUICSS_clearEvent(gPruIcssHandle, PRU_TRIGGER_HOST_SDFM_EVT); /* SDFM Output sample for Channel 0 */ sdfm_ch0_samples[sdfm_ch0_idx++] = SDFM_getFilterData(0); @@ -342,8 +411,27 @@ static void epwmIrqHandler(void *args) gEpwmIsrCnt++; status = EPWM_etIntrStatus(gEpwm0BaseAddr); - if (status & EPWM_ETFLG_INT_MASK) { + if (status & EPWM_ETFLG_INT_MASK) + { EPWM_etIntrClear(gEpwm0BaseAddr); } return; } + +#if APP_EPWM1_ENABLE //DEBUG code for EPWM1 +/* EPWM0 IRQ handler */ +static void epwmIrqHandler1(void *args) +{ + volatile uint16_t status; + + /* debug, inncrement EPWM0 IRQ count */ + gEpwmIsrCnt1++; + + status = EPWM_etIntrStatus(gEpwm1BaseAddr); + if (status & EPWM_ETFLG_INT_MASK) + { + EPWM_etIntrClear(gEpwm0BaseAddr); + } + return; +} +#endif diff --git a/examples/current_sense/icss_sdfm/cfg_pad.c b/examples/current_sense/icss_sdfm/cfg_pad.c index e1ff722..e9d635b 100644 --- a/examples/current_sense/icss_sdfm/cfg_pad.c +++ b/examples/current_sense/icss_sdfm/cfg_pad.c @@ -33,7 +33,7 @@ #include #include "cfg_pad.h" -static Pinmux_PerCfg_t gPinMuxMainDomainCfgSddf[] = { +static Pinmux_PerCfg_t gPinMuxMainDomainCfgsdfm[] = { /* PRG0_ECAP0_IN_APWM_OUT, PRG0_PRU1_GPO15, PRG0_ECAP0_IN_APWM_OUT, U5, J2.C11 */ @@ -65,48 +65,12 @@ static Pinmux_PerCfg_t gPinMuxMainDomainCfgSddf[] = { PIN_PRG0_PRU0_GPO5, ( PIN_MODE(1) | PIN_INPUT_ENABLE | PIN_PULL_DISABLE ) }, - /* SD3_D, - PRG0_PRU0_GPI7, SD3_D, T1, J2B:P7 */ - { - PIN_PRG0_PRU0_GPO7, - ( PIN_MODE(1) | PIN_INPUT_ENABLE | PIN_PULL_DISABLE ) - }, - /* SD4_D, - PRG0_PRU0_GPI18, SD4_D, V1, J2B:P9 */ - { - PIN_PRG0_PRU0_GPO18, - ( PIN_MODE(1) | PIN_INPUT_ENABLE | PIN_PULL_DISABLE ) - }, - /* SD5_D, - PRG0_PRU0_GPI11, SD5_D, Y3, J2B:P14 */ - { - PIN_PRG0_PRU0_GPO11, - ( PIN_MODE(1) | PIN_INPUT_ENABLE | PIN_PULL_DISABLE ) - }, - /* SD6_D, - PRG0_PRU0_GPI13, SD6_D, R6, J2C:P5 */ - { - PIN_PRG0_PRU0_GPO13, - ( PIN_MODE(1) | PIN_INPUT_ENABLE | PIN_PULL_DISABLE ) - }, - /* SD7_D, - PRG0_PRU0_GPI15, SD7_D, T5, J2D:P12 */ - { - PIN_PRG0_PRU0_GPO15, - ( PIN_MODE(1) | PIN_INPUT_ENABLE | PIN_PULL_DISABLE ) - }, - /* SD8_D, - PRG0_PRU0_GPI17, SD8_D, U1, J2B:P8 */ - { - PIN_PRG0_PRU0_GPO17, - ( PIN_MODE(1) | PIN_INPUT_ENABLE | PIN_PULL_DISABLE ) - }, - + {PINMUX_END, PINMUX_END} }; /* Configure SOC pads */ void cfgPad(void) { - Pinmux_config(gPinMuxMainDomainCfgSddf, PINMUX_DOMAIN_ID_MAIN); + Pinmux_config(gPinMuxMainDomainCfgsdfm, PINMUX_DOMAIN_ID_MAIN); } diff --git a/examples/current_sense/icss_sdfm/sddf.c b/examples/current_sense/icss_sdfm/sdfm.c similarity index 74% rename from examples/current_sense/icss_sdfm/sddf.c rename to examples/current_sense/icss_sdfm/sdfm.c index 9d46de5..bb05542 100644 --- a/examples/current_sense/icss_sdfm/sddf.c +++ b/examples/current_sense/icss_sdfm/sdfm.c @@ -41,23 +41,23 @@ #include #include -#include "tisddf_pruss_intc_mapping.h" /* INTC configuration */ -#include "current_sense/sdfm/firmware/sdfm_bin.h" /* SDDF image data */ -#include "sddf.h" -#include "current_sense/sdfm/include/sddf_api.h" -/* PRU SDDF FW image info */ -typedef struct PRUSDDF_PruFwImageInfo_s { +#include "tisdfm_pruss_intc_mapping.h" /* INTC configuration */ +#include "current_sense/sdfm/firmware/sdfm_bin.h" /* SDFM image data */ +#include "sdfm.h" +#include "current_sense/sdfm/include/sdfm_api.h" +/* PRU SDFM FW image info */ +typedef struct PRUSDFM_PruFwImageInfo_s { const uint32_t *pPruImemImg; const uint32_t pruImemImgSz; -} PRUSDDF_PruFwImageInfo; +} PRUSDFM_PruFwImageInfo; /* Number of PRU images */ -#define PRU_SDDF_NUM_PRU_IMAGE ( 3 ) +#define PRU_SDFM_NUM_PRU_IMAGE ( 3 ) -/* PRU SDDF image info */ -static PRUSDDF_PruFwImageInfo gPruFwImageInfo[PRU_SDDF_NUM_PRU_IMAGE] = +/* PRU SDFM image info */ +static PRUSDFM_PruFwImageInfo gPruFwImageInfo[PRU_SDFM_NUM_PRU_IMAGE] = { - {pru_SDDF_PRU0_image_0, sizeof(pru_SDDF_PRU0_image_0)}, /* PRU FW */ + {pru_SDFM_PRU0_image_0, sizeof(pru_SDFM_PRU0_image_0)}, /* PRU FW */ {NULL, 0} }; @@ -82,7 +82,7 @@ int32_t initIcss( /* Open ICSS PRU instance */ pruIcssHandle = PRUICSS_open(icssInstId); if (pruIcssHandle == NULL) { - return SDDF_ERR_INIT_ICSSG; + return SDFM_ERR_INIT_ICSSG; } /* Disable slice PRU cores */ @@ -90,31 +90,31 @@ int32_t initIcss( { status = PRUICSS_disableCore(pruIcssHandle, PRUICSS_PRU0); if (status != SystemP_SUCCESS) { - return SDDF_ERR_INIT_ICSSG; + return SDFM_ERR_INIT_ICSSG; } } else if (sliceId == ICSSG_SLICE_ID_1) { status = PRUICSS_disableCore(pruIcssHandle, PRUICSS_PRU1); if (status != SystemP_SUCCESS) { - return SDDF_ERR_INIT_ICSSG; + return SDFM_ERR_INIT_ICSSG; } } else { - return SDDF_ERR_INIT_ICSSG; + return SDFM_ERR_INIT_ICSSG; } /* Reset slice memories */ size = PRUICSS_initMemory(pruIcssHandle, PRUICSS_IRAM_PRU(sliceId)); if (size == 0) { - return SDDF_ERR_INIT_ICSSG; + return SDFM_ERR_INIT_ICSSG; } size = PRUICSS_initMemory(pruIcssHandle, PRUICSS_DATARAM(sliceId)); if (size == 0) { - return SDDF_ERR_INIT_ICSSG; + return SDFM_ERR_INIT_ICSSG; } /* Set ICSS pin mux */ @@ -123,12 +123,12 @@ int32_t initIcss( /* Initialize ICSS INTC */ status = PRUICSS_intcInit(pruIcssHandle, &gPruicssIntcInitdata); if (status != SystemP_SUCCESS) { - return SDDF_ERR_INIT_ICSSG; + return SDFM_ERR_INIT_ICSSG; } *pPruIcssHandle = pruIcssHandle; - return SDDF_ERR_NERR; + return SDFM_ERR_NERR; } void sdfm_configure_gpio_pin(sdfm_handle h_sdfm) { @@ -169,95 +169,99 @@ void sdfm_configure_gpio_pin(sdfm_handle h_sdfm) } -/* Initialize SDDF PRU FW */ -int32_t init_sdfm_pru_fw(uint8_t pruId, SddfPrms *pSddfPrms, sdfm_handle *pHSddf) +/* Initialize SDFM PRU FW */ +int32_t init_sdfm_pru_fw(uint8_t pruId, SdfmPrms *pSdfmPrms, sdfm_handle *pHSdfm) { - sdfm_handle hSddf; + sdfm_handle hSdfm; - /* Initialize SDDF instance */ - hSddf = SDFM_init(pruId); - if (hSddf == NULL) + /* Initialize SDFM instance */ + hSdfm = SDFM_init(pruId); + if (hSdfm == NULL) { - return SDDF_ERR_INIT_SDDF; + return SDFM_ERR_INIT_SDFM; } uint8_t SDFM_CH; - hSddf->iep_clock = 300000000; //300MHz - hSddf->sdfm_clock = 20000000; //20MHz - hSddf->iep_inc = 1; // Default IEP increment 1 + hSdfm->iep_clock = pSdfmPrms->iep_clock; + hSdfm->sdfm_clock = pSdfmPrms->sd_clock; + hSdfm->iep_inc = 1; /* Default IEP increment 1 */ + - uint8_t acc_osr = 13; uint8_t acc_filter = 0; //SINC3 filter uint8_t ecap_divider = 0x0F; //IEP at 300MHz: SD clock = 300/15=20Mhz /*configure IEP count for one epwm period*/ - SDFM_configIepCount(hSddf, pSddfPrms->epwm_out_freq); + SDFM_configIepCount(hSdfm, pSdfmPrms->epwm_out_freq); /*configure ecap as PWM code for generate 20 MHz sdfm clock*/ - SDFM_configEcap(hSddf, ecap_divider); + SDFM_configEcap(hSdfm, ecap_divider); - /*set comparator osr or OC osr*/ - SDFM_setCompFilterOverSamplingRatio(hSddf, pSddfPrms->ComFilterOsr); - - /*set OC sample count for NC & NC OSR */ - SDFM_setFilterOverSamplingRatio(hSddf, pSddfPrms->FilterOsr, pSddfPrms->ComFilterOsr); + /*set Noraml current OSR */ + SDFM_setFilterOverSamplingRatio(hSdfm, pSdfmPrms->FilterOsr); /*below configuration for all three channel*/ for(SDFM_CH = 0; SDFM_CH < NUM_CH_SUPPORTED; SDFM_CH++) { - SDFM_setEnableChannel(hSddf, SDFM_CH); + SDFM_setEnableChannel(hSdfm, SDFM_CH); - SDFM_setAccOverSamplingRatio(hSddf, SDFM_CH, acc_osr); + /*set comparator osr or Over current osr*/ + SDFM_setCompFilterOverSamplingRatio(hSdfm, SDFM_CH, pSdfmPrms->ComFilterOsr); /*set ACC source or filter type*/ - SDFM_configDataFilter(hSddf, SDFM_CH, acc_filter); + SDFM_configDataFilter(hSdfm, SDFM_CH, acc_filter); /*set clock inversion & clock source for all three channel*/ - SDFM_selectClockSource(hSddf, SDFM_CH, pSddfPrms->clkPrms[SDFM_CH]); + SDFM_selectClockSource(hSdfm, SDFM_CH, pSdfmPrms->clkPrms[SDFM_CH]); /*set threshold values */ - SDFM_setCompFilterThresholds(hSddf, SDFM_CH, pSddfPrms->threshold_parms[SDFM_CH]); - - - - if(pSddfPrms->en_com) + SDFM_setCompFilterThresholds(hSdfm, SDFM_CH, pSdfmPrms->threshold_parms[SDFM_CH]); + + if(pSdfmPrms->en_com) { - SDFM_enableComparator(hSddf, SDFM_CH); + SDFM_enableComparator(hSdfm, SDFM_CH); } else { - SDFM_disableComparator(hSddf, SDFM_CH); + SDFM_disableComparator(hSdfm, SDFM_CH); } } /*GPIO pin configuration for threshold measurment*/ - sdfm_configure_gpio_pin(hSddf); + sdfm_configure_gpio_pin(hSdfm); - SDFM_setSampleReadingTime(hSddf, pSddfPrms->trigSampTime); + SDFM_setSampleTriggerTime(hSdfm, pSdfmPrms->firstSampTrigTime); + if(pSdfmPrms->en_second_update) + { + SDFM_enableDoubleSampling(hSdfm, pSdfmPrms->secondSampTrigTime); + } + else + { + SDFM_disableDoubleSampling(hSdfm); + } - /* Enable (global) SDDF */ - SDFM_enable(hSddf); + /* Enable (global) SDFM */ + SDFM_enable(hSdfm); - pHSddf = &hSddf; + pHSdfm = &hSdfm; - return SDDF_ERR_NERR; + return SDFM_ERR_NERR; } /* - * ======== initPruSddf ======== + * ======== initPruSdfm ======== */ -/* Initialize PRU core for SDDF */ -int32_t initPruSddf( +/* Initialize PRU core for SDFM */ +int32_t initPruSdfm( PRUICSS_Handle pruIcssHandle, uint8_t pruInstId, - SddfPrms *pSddfPrms, - sdfm_handle *pHSddf + SdfmPrms *pSdfmPrms, + sdfm_handle *pHSdfm ) { uint8_t sliceId; uint32_t pruIMem; - PRUSDDF_PruFwImageInfo *pPruFwImageInfo; + PRUSDFM_PruFwImageInfo *pPruFwImageInfo; int32_t size; const uint32_t *sourceMem; /* Source memory[ Array of uint32_t ] */ uint32_t imemOffset; /* Offset at which write will happen */ @@ -268,7 +272,7 @@ int32_t initPruSddf( /* Reset PRU */ status = PRUICSS_resetCore(pruIcssHandle, pruInstId); if (status != SystemP_SUCCESS) { - return SDDF_ERR_INIT_PRU_SDDF; + return SDFM_ERR_INIT_PRU_SDFM; } /* Calculate slice ID */ @@ -299,7 +303,7 @@ int32_t initPruSddf( if ((pPruFwImageInfo == NULL) || (pPruFwImageInfo->pPruImemImg == NULL)) { - return SDDF_ERR_INIT_PRU_SDDF; + return SDFM_ERR_INIT_PRU_SDFM; } /* Write IMEM */ @@ -309,15 +313,15 @@ int32_t initPruSddf( size = PRUICSS_writeMemory(pruIcssHandle, pruIMem, imemOffset, sourceMem, byteLen); if (size == 0) { - return SDDF_ERR_INIT_PRU_SDDF; + return SDFM_ERR_INIT_PRU_SDFM; } /* Enable PRU */ status = PRUICSS_enableCore(pruIcssHandle, pruInstId); if (status != SystemP_SUCCESS) { - return SDDF_ERR_INIT_PRU_SDDF; + return SDFM_ERR_INIT_PRU_SDFM; } -/* Translate PRU ID to SDDF API */ +/* Translate PRU ID to SDFM API */ if (pruInstId == PRUICSS_PRU0) { pruId = PRU_ID_0; } @@ -325,15 +329,15 @@ int32_t initPruSddf( pruId = PRU_ID_1; } else { - return SDDF_ERR_INIT_PRU_SDDF; + return SDFM_ERR_INIT_PRU_SDFM; } - /* Initialize SDDF PRU FW */ - status = init_sdfm_pru_fw(pruId, pSddfPrms, pHSddf); - if (status != SDDF_ERR_NERR) { - return SDDF_ERR_INIT_PRU_SDDF; + /* Initialize SDFM PRU FW */ + status = init_sdfm_pru_fw(pruId, pSdfmPrms, pHSdfm); + if (status != SDFM_ERR_NERR) { + return SDFM_ERR_INIT_PRU_SDFM; } - return SDDF_ERR_NERR; + return SDFM_ERR_NERR; } diff --git a/examples/current_sense/icss_sdfm/sddf.h b/examples/current_sense/icss_sdfm/sdfm.h similarity index 75% rename from examples/current_sense/icss_sdfm/sddf.h rename to examples/current_sense/icss_sdfm/sdfm.h index 45c655c..41bd71c 100644 --- a/examples/current_sense/icss_sdfm/sddf.h +++ b/examples/current_sense/icss_sdfm/sdfm.h @@ -30,34 +30,34 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef _SDDF_H_ -#define _SDDF_H_ +#ifndef _SDFM_H_ +#define _SDFM_H_ #include #include -#include "current_sense/sdfm/include/sddf_api.h" +#include "current_sense/sdfm/include/sdfm_api.h" /* Status codes */ -#define SDDF_ERR_NERR ( 0 ) /* no error */ -#define SDDF_ERR_CFG_PIN_MUX ( -1 ) /* pin mux configuration error */ -#define SDDF_ERR_CFG_ICSSG_CLKCFG ( -2 ) /* ICSSG clock configuration error */ -#define SDDF_ERR_INIT_ICSSG ( -3 ) /* initialize ICSSG error */ -#define SDDF_ERR_CFG_MCU_INTR ( -4 ) /* interrupt configuration error */ -#define SDDF_ERR_INIT_PRU_SDDF ( -5 ) /* initialize PRU for SDDF error */ -#define SDDF_ERR_INIT_SDDF ( -6 ) /* initialize SDDF error */ +#define SDFM_ERR_NERR ( 0 ) /* no error */ +#define SDFM_ERR_CFG_PIN_MUX ( -1 ) /* pin mux configuration error */ +#define SDFM_ERR_CFG_ICSSG_CLKCFG ( -2 ) /* ICSSG clock configuration error */ +#define SDFM_ERR_INIT_ICSSG ( -3 ) /* initialize ICSSG error */ +#define SDFM_ERR_CFG_MCU_INTR ( -4 ) /* interrupt configuration error */ +#define SDFM_ERR_INIT_PRU_SDFM ( -5 ) /* initialize PRU for SDFM error */ +#define SDFM_ERR_INIT_SDFM ( -6 ) /* initialize SDFM error */ -/* Bit for SDDF configuration mask */ -#define SDDF_CFG_CLK ( 1<<0 ) -#define SDDF_CFG_OSR ( 1<<1 ) -#define SDDF_CFG_TRIG_SAMP_TIME ( 1<<2 ) -#define SDDF_CFG_TRIG_SAMP_CNT ( 1<<3 ) -#define SDDF_CFG_CH_EN ( 1<<4 ) -#define SDDF_CFG_FD ( 1<<5 ) -#define SDDF_CFG_TRIG_OUT_SAMP_BUF ( 1<<6 ) +/* Bit for SDFM configuration mask */ +#define SDFM_CFG_CLK ( 1<<0 ) +#define SDFM_CFG_OSR ( 1<<1 ) +#define SDFM_CFG_TRIG_SAMP_TIME ( 1<<2 ) +#define SDFM_CFG_TRIG_SAMP_CNT ( 1<<3 ) +#define SDFM_CFG_CH_EN ( 1<<4 ) +#define SDFM_CFG_FD ( 1<<5 ) +#define SDFM_CFG_TRIG_OUT_SAMP_BUF ( 1<<6 ) -/* SDDF mode */ -#define SDDF_MODE_TRIG ( 0 ) -#define SDDF_MODE_CONT ( 1 ) +/* SDFM mode */ +#define SDFM_MODE_TRIG ( 0 ) +#define SDFM_MODE_CONT ( 1 ) /* ICSSG Core clock source selection options */ #define CORE_CLK_SEL_ICSSGn_CORE_CLK ( 0 ) /* Mux Output */ @@ -121,16 +121,31 @@ typedef enum PRUICSS_MaxInstances_s PRUICSS_INSTANCE_MAX=2 } PRUICSS_MaxInstances; -/* SDDF configuration parameters */ -typedef struct SddfPrms_s { - float trigSampTime; +/* SDFM configuration parameters */ +typedef struct SdfmPrms_s { + /**< IEP clock value */ + uint32_t iep_clock; + /**< Sigma delta input clock value */ + uint32_t sd_clock; + /**< double update enable field */ + uint8_t en_second_update; + /**< First normal current sample trigger time */ + float firstSampTrigTime; + /**< First normal current sample trigger time */ + float secondSampTrigTime; + /**< output freq. of EPWM0 */ uint32_t epwm_out_freq; + /**< Over current threshold parameters */ SDFM_ThresholdParms threshold_parms[NUM_CH_SUPPORTED]; + /**< SD clock source and clock inversion */ SDFM_ClkSourceParms clkPrms[3]; + /**< Over current OSR */ uint16_t ComFilterOsr; + /**< Normal current OSR */ uint16_t FilterOsr; + /**< over current enable field */ uint8_t en_com; -} SddfPrms; +} SdfmPrms; /* Initialize ICSSG */ @@ -141,13 +156,13 @@ int32_t initIcss( PRUICSS_Handle *pPruIcssHandle ); -/* Initialize PRU core for SDDF */ -int32_t initPruSddf( +/* Initialize PRU core for SDFM */ +int32_t initPruSdfm( PRUICSS_Handle pruIcssHandle, uint8_t pruInstId, - SddfPrms *pSddfPrms, - sdfm_handle *pHSddf + SdfmPrms *pSdfmPrms, + sdfm_handle *pHSdfm ); -#endif /* _SDDF_H_ */ +#endif /* _SDFM_H_ */ diff --git a/examples/current_sense/icss_sdfm/tisddf_pruss_intc_mapping.h b/examples/current_sense/icss_sdfm/tisdfm_pruss_intc_mapping.h similarity index 100% rename from examples/current_sense/icss_sdfm/tisddf_pruss_intc_mapping.h rename to examples/current_sense/icss_sdfm/tisdfm_pruss_intc_mapping.h diff --git a/makefile.am243x b/makefile.am243x index 2eb02b2..f70fd92 100644 --- a/makefile.am243x +++ b/makefile.am243x @@ -58,6 +58,7 @@ help: @echo $(MAKE) -s -C examples/position_sense/tamagawa_diagnostic/single_channel/am243x-evm/r5fss0-0_freertos/ti-arm-clang [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C examples/position_sense/tamagawa_diagnostic/single_channel/am243x-lp/r5fss0-0_freertos/ti-arm-clang [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang [all clean syscfg-gui syscfg] + @echo $(MAKE) -s -C examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C source/position_sense/endat/firmware/multi_channel_load_share/am243x-evm/icssg0-pru1_fw/ti-pru-cgt [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C source/position_sense/endat/firmware/multi_channel_load_share/am243x-evm/icssg0-rtupru1_fw/ti-pru-cgt [all clean syscfg-gui syscfg] @@ -183,6 +184,7 @@ BUILD_COMBO_EXAMPLE_ALL += tamagawa_diagnostic_multi_channel_am243x-evm_r5fss0-0 BUILD_COMBO_EXAMPLE_ALL += tamagawa_diagnostic_single_channel_am243x-evm_r5fss0-0_freertos_ti-arm-clang BUILD_COMBO_EXAMPLE_ALL += tamagawa_diagnostic_single_channel_am243x-lp_r5fss0-0_freertos_ti-arm-clang BUILD_COMBO_EXAMPLE_ALL += icss_sdfm_am243x-evm_r5fss0-0_freertos_ti-arm-clang +BUILD_COMBO_EXAMPLE_ALL += icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang # Various System Example Targets BUILD_COMBO_EXAMPLE_PRIVATE_ALL = @@ -243,6 +245,9 @@ examples-private: $(BUILD_COMBO_EXAMPLE_PRIVATE_ALL) icss_sdfm_am243x-evm_r5fss0-0_freertos_ti-arm-clang: $(MAKE) -C examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile all + icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang: + $(MAKE) -C examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile all + sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt: $(MAKE) -C source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile all @@ -300,6 +305,7 @@ BUILD_COMBO_EXAMPLE_CLEAN_ALL += tamagawa_diagnostic_multi_channel_am243x-evm_r5 BUILD_COMBO_EXAMPLE_CLEAN_ALL += tamagawa_diagnostic_single_channel_am243x-evm_r5fss0-0_freertos_ti-arm-clang_clean BUILD_COMBO_EXAMPLE_CLEAN_ALL += tamagawa_diagnostic_single_channel_am243x-lp_r5fss0-0_freertos_ti-arm-clang_clean BUILD_COMBO_EXAMPLE_CLEAN_ALL += icss_sdfm_am243x-evm_r5fss0-0_freertos_ti-arm-clang_clean +BUILD_COMBO_EXAMPLE_CLEAN_ALL += icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang_clean # Various System Example Clean Targets BUILD_COMBO_EXAMPLE_PRIVATE_CLEAN_ALL = @@ -360,6 +366,9 @@ examples-private-clean: $(BUILD_COMBO_EXAMPLE_PRIVATE_CLEAN_ALL) icss_sdfm_am243x-evm_r5fss0-0_freertos_ti-arm-clang_clean: $(MAKE) -C examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile clean + icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang_clean: + $(MAKE) -C examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile clean + sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt_clean: $(MAKE) -C source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile clean @@ -417,6 +426,7 @@ BUILD_COMBO_EXAMPLE_SCRUB_ALL += tamagawa_diagnostic_multi_channel_am243x-evm_r5 BUILD_COMBO_EXAMPLE_SCRUB_ALL += tamagawa_diagnostic_single_channel_am243x-evm_r5fss0-0_freertos_ti-arm-clang_scrub BUILD_COMBO_EXAMPLE_SCRUB_ALL += tamagawa_diagnostic_single_channel_am243x-lp_r5fss0-0_freertos_ti-arm-clang_scrub BUILD_COMBO_EXAMPLE_SCRUB_ALL += icss_sdfm_am243x-evm_r5fss0-0_freertos_ti-arm-clang_scrub +BUILD_COMBO_EXAMPLE_SCRUB_ALL += icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang_scrub # Various System Example Scrub Targets BUILD_COMBO_EXAMPLE_PRIVATE_SCRUB_ALL = @@ -477,6 +487,9 @@ examples-scrub-private: $(BUILD_COMBO_EXAMPLE_PRIVATE_SCRUB_ALL) icss_sdfm_am243x-evm_r5fss0-0_freertos_ti-arm-clang_scrub: $(MAKE) -C examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile scrub + icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang_scrub: + $(MAKE) -C examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile scrub + sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt_scrub: $(MAKE) -C source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile scrub diff --git a/makefile_projectspec.am243x b/makefile_projectspec.am243x index 6d28904..bc449ba 100644 --- a/makefile_projectspec.am243x +++ b/makefile_projectspec.am243x @@ -19,6 +19,7 @@ BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += tamagawa_diagnostic_multi_channel_a BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += tamagawa_diagnostic_single_channel_am243x-evm_r5fss0-0_freertos_ti-arm-clang_build BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += tamagawa_diagnostic_single_channel_am243x-lp_r5fss0-0_freertos_ti-arm-clang_build BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += icss_sdfm_am243x-evm_r5fss0-0_freertos_ti-arm-clang_build +BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang_build # Various System Example Projectspec Build Targets BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_PRIVATE_ALL = @@ -79,6 +80,9 @@ all-private: $(BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_PRIVATE_ALL) icss_sdfm_am243x-evm_r5fss0-0_freertos_ti-arm-clang_build: $(MAKE) -C examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec all + icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang_build: + $(MAKE) -C examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec all + sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt_build: $(MAKE) -C source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile_projectspec all @@ -137,6 +141,7 @@ BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += tamagawa_diagnostic_multi_channel_a BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += tamagawa_diagnostic_single_channel_am243x-evm_r5fss0-0_freertos_ti-arm-clang_clean BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += tamagawa_diagnostic_single_channel_am243x-lp_r5fss0-0_freertos_ti-arm-clang_clean BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += icss_sdfm_am243x-evm_r5fss0-0_freertos_ti-arm-clang_clean +BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang_clean # Various System Example Projectspec Clean Targets BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_PRIVATE_ALL = @@ -197,6 +202,9 @@ clean-private: $(BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_PRIVATE_ALL) icss_sdfm_am243x-evm_r5fss0-0_freertos_ti-arm-clang_clean: $(MAKE) -C examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec clean + icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang_clean: + $(MAKE) -C examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec clean + sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt_clean: $(MAKE) -C source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile_projectspec clean @@ -255,6 +263,7 @@ BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += tamagawa_diagnostic_multi_channel_ BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += tamagawa_diagnostic_single_channel_am243x-evm_r5fss0-0_freertos_ti-arm-clang_export BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += tamagawa_diagnostic_single_channel_am243x-lp_r5fss0-0_freertos_ti-arm-clang_export BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += icss_sdfm_am243x-evm_r5fss0-0_freertos_ti-arm-clang_export +BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang_export # Various System Example Projectspec Export Targets BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_PRIVATE_ALL = @@ -315,6 +324,9 @@ export-private: $(BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_PRIVATE_ALL) icss_sdfm_am243x-evm_r5fss0-0_freertos_ti-arm-clang_export: $(MAKE) -C examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec export + icss_sdfm_am243x-lp_r5fss0-0_freertos_ti-arm-clang_export: + $(MAKE) -C examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec export + sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt_export: $(MAKE) -C source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile_projectspec export @@ -398,6 +410,7 @@ help: @echo $(MAKE) -s -C examples/position_sense/tamagawa_diagnostic/single_channel/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C examples/position_sense/tamagawa_diagnostic/single_channel/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec [export all clean] + @echo $(MAKE) -s -C examples/current_sense/icss_sdfm/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C source/position_sense/endat/firmware/multi_channel_load_share/am243x-evm/icssg0-pru1_fw/ti-pru-cgt -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C source/position_sense/endat/firmware/multi_channel_load_share/am243x-evm/icssg0-rtupru1_fw/ti-pru-cgt -f makefile_projectspec [export all clean] diff --git a/source/current_sense/sdfm/driver/sdfm_drv.c b/source/current_sense/sdfm/driver/sdfm_drv.c index 86505a6..30bddc9 100644 --- a/source/current_sense/sdfm/driver/sdfm_drv.c +++ b/source/current_sense/sdfm/driver/sdfm_drv.c @@ -34,8 +34,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -122,11 +122,9 @@ SDFM g_sdfm[NUM_PRU] = { sdfm_handle SDFM_init(uint8_t pru_id) { SDFM *p_sdfm; - uint8_t ctrl; - uint8_t stat; - uint8_t pru_id_ack; - if (pru_id == PRU_ID_0) { + if (pru_id == PRU_ID_0) + { /* Initialize PRU 0 SD */ p_sdfm = &g_sdfm[pru_id]; @@ -135,38 +133,22 @@ sdfm_handle SDFM_init(uint8_t pru_id) p_sdfm->p_sdfm_interface = (SDFM_Interface *)(PRU_ICSSG_DRAM0_SLV_RAM + 0x0); /* Set FW PRU ID */ - ctrl = p_sdfm->p_sdfm_interface->sdfm_ctrl.ctrl; - ctrl &= ~SDDF_CTRL_BF_PRU_ID_MASK; - ctrl |= pru_id << SDDF_CTRL_BF_PRU_ID_SHIFT; - p_sdfm->p_sdfm_interface->sdfm_ctrl.ctrl = ctrl; - - /* Wait for FW PRU ID ACK */ - do { - stat = p_sdfm->p_sdfm_interface->sdfm_ctrl.stat; - pru_id_ack = (stat & SDDF_STAT_BF_PRU_ID_ACK_MASK) >> SDDF_STAT_BF_PRU_ID_ACK_SHIFT; - } while (pru_id_ack != pru_id); + p_sdfm->p_sdfm_interface->sdfm_ctrl.sdfm_pru_id = pru_id; } - else if (pru_id == PRU_ID_1) { + else if (pru_id == PRU_ID_1) + { /* Initialize PRU 1 SD */ p_sdfm = &g_sdfm[pru_id]; /* Initialize SDFM control address */ - p_sdfm->p_sdfm_interface = (SDFM_Interface *)(PRU_ICSSG_DRAM1_SLV_RAM + 0x0); + p_sdfm->p_sdfm_interface = (SDFM_Interface *)(PRU_ICSSG_DRAM0_SLV_RAM + 0x0); /* Set FW PRU ID */ - ctrl = p_sdfm->p_sdfm_interface->sdfm_ctrl.ctrl; - ctrl &= ~SDDF_CTRL_BF_PRU_ID_MASK; - ctrl |= pru_id << SDDF_CTRL_BF_PRU_ID_SHIFT; - p_sdfm->p_sdfm_interface->sdfm_ctrl.ctrl = ctrl; - - /* Wait for FW PRU ID ACK */ - do { - stat = p_sdfm->p_sdfm_interface->sdfm_ctrl.stat; - pru_id_ack = (stat & SDDF_STAT_BF_PRU_ID_ACK_MASK) >> SDDF_STAT_BF_PRU_ID_ACK_SHIFT; - } while (pru_id_ack != pru_id); + p_sdfm->p_sdfm_interface->sdfm_ctrl.sdfm_pru_id = pru_id; } - else { + else + { p_sdfm = NULL; } @@ -199,28 +181,47 @@ void SDFM_configEcap(sdfm_handle h_sdfm, uint8_t ecap_divider) } /*sdfm Hw osr configuration */ - void SDFM_setAccOverSamplingRatio(sdfm_handle h_sdfm, uint8_t ch_id, uint8_t osr) + void SDFM_setCompFilterOverSamplingRatio(sdfm_handle h_sdfm, uint8_t ch_id, uint16_t osr) { - /*SD Hw OSR*/ + /*Over current OSR*/ h_sdfm->p_sdfm_interface->sdfm_cfg_ptr[ch_id].osr = osr; } /*sdfm high, low threshold config */ void SDFM_setCompFilterThresholds(sdfm_handle h_sdfm, uint8_t ch_id, SDFM_ThresholdParms thresholdParms) { - /* SD OC high threshold = (OC OSR)^(OC SINC ORDER) = 14^3 = 2744*/ + /* SD Over current high threshold = (Over current OSR)^(Over current SINC ORDER) = 14^3 = 2744*/ h_sdfm->p_sdfm_interface->sdfm_cfg_ptr[ch_id].sdfm_threshold_parms.high_threshold = thresholdParms.high_threshold; - /* SD OC low threshold */ + /* SD Over current low threshold */ h_sdfm->p_sdfm_interface->sdfm_cfg_ptr[ch_id].sdfm_threshold_parms.low_threshold = thresholdParms.low_threshold; } /*sdfm smapling time configuation */ -void SDFM_setSampleReadingTime(sdfm_handle h_sdfm, float trig_samp_time) +void SDFM_setSampleTriggerTime(sdfm_handle h_sdfm, float samp_trig_time) { /*convert sample time into IEP count*/ /*samp time in us */ - int32_t count = (h_sdfm->iep_clock /1000000)*((float)trig_samp_time); - h_sdfm->p_sdfm_interface->sdfm_cfg_trigger.trig_samp_time = count; + int32_t count = (h_sdfm->iep_clock /1000000)*((float)samp_trig_time); + h_sdfm->p_sdfm_interface->sdfm_cfg_trigger.first_samp_trig_time = count; + + + +} +/*Second normal current sampling configuration*/ +void SDFM_enableDoubleSampling(sdfm_handle h_sdfm, float samp_trig_time) +{ + /*Enable double normal current sampling*/ + h_sdfm->p_sdfm_interface->sdfm_cfg_trigger.en_double_nc_sampling = 1; + /*Second sample point*/ + int32_t count = (h_sdfm->iep_clock /1000000)*((float)samp_trig_time); + h_sdfm->p_sdfm_interface->sdfm_cfg_trigger.second_samp_trig_time = count; +} + +/*Disable Double update*/ +void SDFM_disableDoubleSampling(sdfm_handle h_sdfm) +{ + /*Enable double normal current sampling*/ + h_sdfm->p_sdfm_interface->sdfm_cfg_trigger.en_double_nc_sampling = 0; } /* Enable the channel specified by the channel number parameter*/ void SDFM_setEnableChannel(sdfm_handle h_sdfm, uint8_t channel_number) @@ -228,17 +229,17 @@ void SDFM_setEnableChannel(sdfm_handle h_sdfm, uint8_t channel_number) if(channel_number == 0) { - h_sdfm->p_sdfm_interface->sdfm_ch_ctrl.sdfm_ch_id |= (channel_number << SDDF_CFG_BF_SD_CH0_ID_SHIFT); + h_sdfm->p_sdfm_interface->sdfm_ch_ctrl.sdfm_ch_id |= (channel_number << SDFM_CFG_BF_SD_CH0_ID_SHIFT); h_sdfm->p_sdfm_interface->sdfm_cfg_ptr[channel_number].ch_id = channel_number; } else if(channel_number == 1) { - h_sdfm->p_sdfm_interface->sdfm_ch_ctrl.sdfm_ch_id |= (channel_number<< SDDF_CFG_BF_SD_CH1_ID_SHIFT); + h_sdfm->p_sdfm_interface->sdfm_ch_ctrl.sdfm_ch_id |= (channel_number<< SDFM_CFG_BF_SD_CH1_ID_SHIFT); h_sdfm->p_sdfm_interface->sdfm_cfg_ptr[channel_number].ch_id = channel_number; } else { - h_sdfm->p_sdfm_interface->sdfm_ch_ctrl.sdfm_ch_id |= (channel_number << SDDF_CFG_BF_SD_CH2_ID_SHIFT); + h_sdfm->p_sdfm_interface->sdfm_ch_ctrl.sdfm_ch_id |= (channel_number << SDFM_CFG_BF_SD_CH2_ID_SHIFT); h_sdfm->p_sdfm_interface->sdfm_cfg_ptr[channel_number].ch_id = channel_number; } } @@ -258,7 +259,8 @@ void SDFM_selectClockSource(sdfm_handle h_sdfm, uint8_t ch_id, SDFM_ClkSourcePar /* Enable the comparator feature for a specified filter/channel */ void SDFM_enableComparator(sdfm_handle h_sdfm, uint8_t ch) { - h_sdfm->p_sdfm_interface->sdfm_ch_ctrl.enable_comparator |= (1 << ch); + /*It is setting bits for enable Over current: 0th bit for Over current enable & from 1st bits to 3rd bits are for ch0 to ch2.*/ + h_sdfm->p_sdfm_interface->sdfm_ch_ctrl.enable_comparator |= ((1 << (ch+1))|(1)); } /* Disable the comparator feature for a specified filter/channel */ @@ -288,55 +290,30 @@ uint32_t SDFM_getFilterData(uint8_t ch) p_sdfm->p_sdfm_interface = (SDFM_Interface *)(PRU_ICSSG_DRAM0_SLV_RAM + 0x0); return p_sdfm->p_sdfm_interface->curr_out_samp_buf[ch]; } -/*Configure Over current OSR*/ -void SDFM_setCompFilterOverSamplingRatio(sdfm_handle h_sdfm, uint16_t osr) + +/*Configure normal current OSR for data filter*/ +void SDFM_setFilterOverSamplingRatio(sdfm_handle h_sdfm, uint16_t nc_osr) { - /*; IEP0 counts in OC sampling period: - ; - IEP0 count = - ; (NC OSR * SD clock period)*(IEP0 frequency * IEP default count) = - ; (NC OSR * IEP0 frequency * IEP default count)/(SD clock frequency) = - ; 64*300e6*1/20e6 = 960*/ - //IEP freq. 300MHz //SDFM clock 20MHz - // IEP Count = (OSR *(1/SD clock))*(IEP freq.) + + /*IEP0 counts in normal current sampling period*/ uint16_t count; uint32_t iep_freq = h_sdfm->iep_clock; uint32_t sd_clock = h_sdfm->sdfm_clock; - count = (osr*(iep_freq/sd_clock)); - h_sdfm->p_sdfm_interface->sdfm_cfg_trigger.oc_prd_iep_cnt = count; - -} - -/*Configure normal current OSR*/ -void SDFM_setFilterOverSamplingRatio(sdfm_handle h_sdfm, uint16_t nc_osr, uint16_t oc_osr) -{ - /*OC sample count for NC sampling */ - uint16_t count; - count = (nc_osr/oc_osr); - h_sdfm->p_sdfm_interface->sdfm_cfg_trigger.sample_count = count; - - /*IEP0 counts in NC sampling period*/ - uint32_t iep_freq = h_sdfm->iep_clock; - uint32_t sd_clock = h_sdfm->sdfm_clock; - count = (nc_osr*(iep_freq/sd_clock)); + count = (int)((float)nc_osr*((float)iep_freq/(float)sd_clock)); h_sdfm->p_sdfm_interface->sdfm_cfg_trigger.nc_prd_iep_cnt = count; } /* SDFM global enable */ void SDFM_enable(sdfm_handle h_sdfm) { - uint8_t sdfm_ctrl; - uint8_t sdfm_stat; uint8_t sdfm_en_ack; - sdfm_ctrl = h_sdfm->p_sdfm_interface->sdfm_ctrl.ctrl; - sdfm_ctrl &= ~SDDF_CTRL_BF_SDDF_EN_MASK; - sdfm_ctrl |= BF_SDDF_EN_ENABLE << SDDF_CTRL_BF_SDDF_EN_SHIFT; - h_sdfm->p_sdfm_interface->sdfm_ctrl.ctrl = sdfm_ctrl; + /*Enable SDFM */ + h_sdfm->p_sdfm_interface->sdfm_ctrl.sdfm_en = 1; /* wait for ACK */ do { - sdfm_stat = h_sdfm->p_sdfm_interface->sdfm_ctrl.stat; - sdfm_en_ack = (sdfm_stat & SDDF_STAT_BF_SDDF_EN_ACK_MASK) >> SDDF_STAT_BF_SDDF_EN_ACK_SHIFT; - } while (sdfm_en_ack != BF_SDDF_EN_ENABLE); + sdfm_en_ack = h_sdfm->p_sdfm_interface->sdfm_ctrl.sdfm_en_ack; + } while (sdfm_en_ack != BF_SDFM_EN_ENABLE); } diff --git a/source/current_sense/sdfm/firmware/.project/project_am243x.js b/source/current_sense/sdfm/firmware/.project/project_am243x.js index 1e7735d..bfddb81 100644 --- a/source/current_sense/sdfm/firmware/.project/project_am243x.js +++ b/source/current_sense/sdfm/firmware/.project/project_am243x.js @@ -4,7 +4,7 @@ let device = "am243x"; const files = { common: [ - "sddf.asm", + "sdfm.asm", "icssg_pru.cmd", ], }; @@ -27,7 +27,7 @@ const readmeDoxygenPageTag = "SDFM_DESIGN"; const cflags_pru = { common: [ "-v4", - "-DSDDF_PRU_CORE", + "-DSDFM_PRU_CORE", "-o2", "--display_error_number", "--hardware_mac=on", @@ -37,9 +37,9 @@ const cflags_pru = { const lflags_pru = { common: [ "--disable_auto_rts", - "--define=SDDF_PRU_CORE=1", + "--define=SDFM_PRU_CORE=1", "--warn_sections", - "--entry_point=SDDF_ENTRY", + "--entry_point=SDFM_ENTRY", "--zero_init=off", ], }; @@ -53,7 +53,7 @@ const buildOptionCombos = [ let postBuildStepsPru = [ - "$(CG_TOOL_ROOT)/bin/hexpru.exe --diag_wrap=off --array --array:name_prefix=pru_SDDF_PRU0_image -o sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt.h sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt.out; move sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt.h ${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/firmware/sdfm_bin.h;" + "$(CG_TOOL_ROOT)/bin/hexpru.exe --diag_wrap=off --array --array:name_prefix=pru_SDFM_PRU0_image -o sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt.h sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt.out; move sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt.h ${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/firmware/sdfm_bin.h;" ]; diff --git a/source/current_sense/sdfm/firmware/.project/project_am64x.js b/source/current_sense/sdfm/firmware/.project/project_am64x.js index 240b10c..b2f2d38 100644 --- a/source/current_sense/sdfm/firmware/.project/project_am64x.js +++ b/source/current_sense/sdfm/firmware/.project/project_am64x.js @@ -4,7 +4,7 @@ let device = "am64x"; const files = { common: [ - "sddf.asm", + "sdfm.asm", "icssg_pru.cmd", ], }; @@ -27,7 +27,7 @@ const readmeDoxygenPageTag = "SDFM_DESIGN"; const cflags_pru = { common: [ "-v4", - "-DSDDF_PRU_CORE", + "-DSDFM_PRU_CORE", "-o2", "--display_error_number", "--hardware_mac=on", @@ -37,9 +37,9 @@ const cflags_pru = { const lflags_pru = { common: [ "--disable_auto_rts", - "--define=SDDF_PRU_CORE=1", + "--define=SDFM_PRU_CORE=1", "--warn_sections", - "--entry_point=SDDF_ENTRY", + "--entry_point=SDFM_ENTRY", "--zero_init=off", ], }; @@ -53,7 +53,7 @@ const buildOptionCombos = [ let postBuildStepsPru = [ - "$(CG_TOOL_ROOT)/bin/hexpru.exe --diag_wrap=off --array --array:name_prefix=pru_SDDF_PRU0_image -o sdfm_firmware_am64x-evm_icssg0-pru0_fw_ti-pru-cgt.h sdfm_firmware_am64x-evm_icssg0-pru0_fw_ti-pru-cgt.out; move sdfm_firmware_am64x-evm_icssg0-pru0_fw_ti-pru-cgt.h ${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/firmware/sdfm_bin.h;" + "$(CG_TOOL_ROOT)/bin/hexpru.exe --diag_wrap=off --array --array:name_prefix=pru_SDFM_PRU0_image -o sdfm_firmware_am64x-evm_icssg0-pru0_fw_ti-pru-cgt.h sdfm_firmware_am64x-evm_icssg0-pru0_fw_ti-pru-cgt.out; move sdfm_firmware_am64x-evm_icssg0-pru0_fw_ti-pru-cgt.h ${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/firmware/sdfm_bin.h;" ]; diff --git a/source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt/example.projectspec b/source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt/example.projectspec index b26bb7d..fe09644 100644 --- a/source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt/example.projectspec +++ b/source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt/example.projectspec @@ -38,7 +38,7 @@ -DSLICE0 -v4 -v4 - -DSDDF_PRU_CORE + -DSDFM_PRU_CORE -o2 --display_error_number --hardware_mac=on @@ -49,14 +49,14 @@ -m=sdfm_firmware.${ConfigName}.map -llibc.a --disable_auto_rts - --define=SDDF_PRU_CORE=1 + --define=SDFM_PRU_CORE=1 --warn_sections - --entry_point=SDDF_ENTRY + --entry_point=SDFM_ENTRY --zero_init=off " postBuildStep=" - $(CG_TOOL_ROOT)/bin/hexpru.exe --diag_wrap=off --array --array:name_prefix=pru_SDDF_PRU0_image -o sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt.h sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt.out; move sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt.h ${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/firmware/sdfm_bin.h; + $(CG_TOOL_ROOT)/bin/hexpru.exe --diag_wrap=off --array --array:name_prefix=pru_SDFM_PRU0_image -o sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt.h sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt.out; move sdfm_firmware_am243x-evm_icssg0-pru0_fw_ti-pru-cgt.h ${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/firmware/sdfm_bin.h; " description="A Sdfm Firmware FW project"> @@ -76,7 +76,7 @@ " > - + diff --git a/source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt/makefile b/source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt/makefile index 07a44e0..ac2fd04 100644 --- a/source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt/makefile +++ b/source/current_sense/sdfm/firmware/am243x-evm/icssg0-pru0_fw/ti-pru-cgt/makefile @@ -56,7 +56,7 @@ ASM_SRCS__QUOTED += \ main.obj: ${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/firmware/main.asm $(GEN_OPTS) | $(GEN_FILES) $(GEN_MISC_FILES) @echo 'Building file: "$<"' @echo 'Invoking: PRU Compiler' - "$(CG_TOOL_ROOT)/bin/clpru" -DICSSG0 -DPRU0 -DSLICE0 -v4 -v4 -DSDDF_PRU_CORE -o2 --display_error_number --hardware_mac=on --define=SOC_AM243X --include_path="$(CCS_PATH)" --include_path="$(SYSCFG_DIR)" --include_path="${CG_TOOL_ROOT}/include" --include_path="${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source" --include_path="${MOTOR_CONTROL_SDK_PATH}/source" --include_path="${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/firmware" --define=_DEBUG_=1 -g --diag_warning=225 --diag_wrap=off --display_error_number --endian=little --preproc_with_compile --preproc_dependency="$(basename $( @@ -76,7 +76,7 @@ " > - + diff --git a/source/current_sense/sdfm/firmware/am64x-evm/icssg0-pru0_fw/ti-pru-cgt/makefile b/source/current_sense/sdfm/firmware/am64x-evm/icssg0-pru0_fw/ti-pru-cgt/makefile index 25e5843..f52dc08 100644 --- a/source/current_sense/sdfm/firmware/am64x-evm/icssg0-pru0_fw/ti-pru-cgt/makefile +++ b/source/current_sense/sdfm/firmware/am64x-evm/icssg0-pru0_fw/ti-pru-cgt/makefile @@ -56,7 +56,7 @@ ASM_SRCS__QUOTED += \ main.obj: ${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/firmware/main.asm $(GEN_OPTS) | $(GEN_FILES) $(GEN_MISC_FILES) @echo 'Building file: "$<"' @echo 'Invoking: PRU Compiler' - "$(CG_TOOL_ROOT)/bin/clpru" -DICSSG0 -DPRU0 -DSLICE0 -v4 -v4 -DSDDF_PRU_CORE -o2 --display_error_number --hardware_mac=on --define=SOC_AM64X --include_path="$(CCS_PATH)" --include_path="$(SYSCFG_DIR)" --include_path="${CG_TOOL_ROOT}/include" --include_path="${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source" --include_path="${MOTOR_CONTROL_SDK_PATH}/source" --include_path="${MOTOR_CONTROL_SDK_PATH}/source/current_sense/sdfm/firmware" --define=_DEBUG_=1 -g --diag_warning=225 --diag_wrap=off --display_error_number --endian=little --preproc_with_compile --preproc_dependency="$(basename $( 20 MHz SD clock, SD_CLK_INV==0 => No clock inversion -INIT_SDDF_CFG_SD_CLK .set (SD_PRD_CLOCKS << SDDF_CFG_SD_CLK_BF_SD_PRD_CLOCKS_SHIFT) | (SD_CLK_INV << SDDF_CFG_SD_CLK_BF_SD_CLK_INV_SHIFT) -; SD OC OSR=(13+1)=14 -INIT_SDDF_CFG_OSR .set (OC_OSR << SDDF_CFG_OC_OSR_BF_OSR_SHIFT) -; SD OC positive threshold = (OC OSR)^(OC SINC ORDER) = 14^3 = 2744 -INIT_SDDF_CFG_OC_POS_THR .set (OC_POS_THR << SDDF_CFG_OC_POS_THR_SHIFT) -; SD OC negative threshold = 1 -INIT_SDDF_CFG_OC_NEG_THR .set (OC_NEG_THR << SDDF_CFG_OC_NEG_THR_SHIFT) -; For SD samp freq==20e6, OSR==64, EPWM (FOC) loop freq = 8e3, sddf_setup_time=0 (TBD) & -; IEP freq = 300e6, IEP counter increment=1: -; (1/2*(1/8e3) - 3/2*(64/20e6) - 0)*300e6*1 = 17310 -; () -; -;for 16KHz (1/2*(1/16e3)-3/2*(64/20e6)-0)*300e6 = 7935 -;for -INIT_SDDF_CFG_TRIG_SAMP_TIME .set (TRIG_SAMP_TIME << SDDF_CFG_TRIG_SAMP_TIME_BF_TRIG_SAMP_TIME_SHIFT) -; Generate 3 NC samples after trigger -INIT_SDDF_CFG_TRIG_SAMP_CNT .set (TRIG_SAMP_CNT << SDDF_CFG_TRIG_SAMP_CNT_BF_TRIG_SAMP_CNT_SHIFT) -; IEP0 counts in NC sampling period: -; - IEP0 count = -; (NC OSR * SD clock period)*(IEP0 frequency * IEP default count) = -; (NC OSR * IEP0 frequency * IEP default count)/(SD clock frequency) = -; 64*300e6*1/20e6 = 960 -; for NC OSR = 128 -; 128*15 = 1920 -; 256*15 = 3840 -INIT_SDDF_CFG_NC_PRD_IEP_CNT .set (NC_PRD_IEP_CNT << SDDF_CFG_NC_PRD_IEP_CNT_SHIFT) -INIT_SDDF_CFG_OUT_SAMP_BUF .set (NC_OUT_SAMP_BUF << SDDF_CFG_NC_OUT_SAMP_BUF_BF_NC_OUT_SAMP_BUF_SHIFT) - - ; SDDF Firmware Registers - .sect ".fwRegs" - .retain ".fwRegs" - .retainrefs ".fwRegs" - .byte INIT_SDDF_CTRL - .byte INIT_SDDF_STAT - .byte INIT_IEP_CFG - .byte 0 ; RESERVED - .word INIT_IEP_CFG_CMP0_CNT_EPWM_PRD - .word INIT_SDDF_CFG_SD_CH_ID - .short INIT_SDDF_CFG_SD_CLK - .byte INIT_SDDF_CFG_OSR - .byte 0 ; RESERVED - .short INIT_SDDF_CFG_OC_POS_THR - .short INIT_SDDF_CFG_OC_NEG_THR - .word INIT_SDDF_CFG_TRIG_SAMP_TIME - .short INIT_SDDF_CFG_TRIG_SAMP_CNT - .short INIT_SDDF_CFG_NC_PRD_IEP_CNT - .word INIT_SDDF_CFG_OUT_SAMP_BUF diff --git a/source/current_sense/sdfm/firmware/icssg_pru.cmd b/source/current_sense/sdfm/firmware/icssg_pru.cmd index 1f8a10c..812443c 100644 --- a/source/current_sense/sdfm/firmware/icssg_pru.cmd +++ b/source/current_sense/sdfm/firmware/icssg_pru.cmd @@ -21,7 +21,7 @@ MEMORY /* RAM */ PRU_FWREGS : org = 0x00000000 len = 0x00000080 RTU_FWREGS : org = 0x00000080 len = 0x00000080 - PRU_DMEM_0_1_LOW : org = 0x00000100 len = 0x00000F00 /* 4kB ICSSG Data RAM 0_1 for PRU*/ + PRU_DMEM_0_1_LOW : org = 0x00000200 len = 0x00000E00 /* 4kB ICSSG Data RAM 0_1 for PRU*/ PRU_DMEM_0_1_HIGH : org = 0x00001000 len = 0x00001000 /* 4kB ICSSG Data RAM 0_1 for RTU*/ PRU_DMEM_1_0 : org = 0x00002000 len = 0x00002000 /* 8kB ICSSG Data RAM 1_0 */ @@ -80,7 +80,7 @@ SECTIONS { /* .fardata > PRU_DMEM_0_1_LOW, PAGE 1 */ .text > PRU_IMEM, PAGE 0 -#if defined (SDDF_PRU_CORE) +#if defined (SDFM_PRU_CORE) .fwRegs > PRU_FWREGS, PAGE 1 .data > PRU_DMEM_0_1_LOW, PAGE 1 .outSamps > PRU_DMEM_0_1_LOW, PAGE 1 diff --git a/source/current_sense/sdfm/firmware/icssg_sddf.h b/source/current_sense/sdfm/firmware/icssg_sddf.h deleted file mode 100644 index 00d16a0..0000000 --- a/source/current_sense/sdfm/firmware/icssg_sddf.h +++ /dev/null @@ -1,341 +0,0 @@ -/* - * Copyright (c) 2023, Texas Instruments Incorporated - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of Texas Instruments Incorporated nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _ICSS_SDDF_H_ -#define _ICSS_SDDF_H_ - -/* Number of SDDF channels per PRU */ -#define ICSSG_NUM_SD_CH ( 9 ) -/* Number of SDDF channels supported by PRU FW */ -#define ICSSG_NUM_SD_CH_FW ( 3 ) - -/* ICSSG INTC events */ -/* Compile-time Host event for SDDF samples available. - Ideally Host would provide this to FW via pseudo-register in DMEM. */ -#define PRU_TRIGGER_HOST_SDDF_EVT ( 2+16 ) /* pr0_pru_mst_intr[2]_intr_req */ -#define RTU_TRIGGER_HOST_SDDF_EVT ( 3+16 ) /* pr0_pru_mst_intr[3]_intr_req */ - - -/* - Firmware registers -*/ - -/* FW register base addresses */ -#define PRU_ICSSG_SDDF_CTRL_BASE ( 0x0000 ) -#define PRU_ICSSG_SDDF_CFG_BASE ( 0x0002 ) -#define RTU_ICSSG_SDDF_CTRL_BASE ( 0x0080 ) -#define RTU_ICSSG_SDDF_CFG_BASE ( 0x0082 ) - -#if defined (SDDF_PRU_CORE) -/* SDDF Control */ -#define ICSSG_SDDF_CTRL_BASE ( PRU_ICSSG_SDDF_CTRL_BASE ) -/* SDDF Configuration */ -#define ICSSG_SDDF_CFG_BASE ( PRU_ICSSG_SDDF_CFG_BASE ) -#elif defined (SDDF_RTU_CORE) -/* SDDF Control */ -#define ICSSG_SDDF_CTRL_BASE ( RTU_ICSSG_SDDF_CTRL_BASE ) -/* SDDF Configuration */ -#define ICSSG_SDDF_CFG_BASE ( RTU_ICSSG_SDDF_CFG_BASE ) -#else -#endif - -/* FW register sizes (in bytes) */ -/* SDDF Control */ -#define FW_REG_SDDF_CTRL_SZ ( 1 ) -#define FW_REG_SDDF_STAT_SZ ( 1 ) - -/* SDDF Configuration */ -#define FW_REG_SDDF_CFG_IEP_CFG_SZ ( 1 ) -#define FW_REG_SDDF_CFG_IEP_CFG_SIM_EPWM_PRD_SZ ( 4 ) -#define FW_REG_SDDF_CFG_SD_CH_ID_SZ ( 4 ) -#define FW_REG_SDDF_CFG_SD_CLK_SZ ( 2 ) -#define FW_REG_SDFM_CFG_OSR_SZ ( 1 ) -#define FW_REG_SDFM_CFG_EN_COMP_SZ ( 2 ) -#define FW_REG_SDFM_CFG_OC_HIGH_THR_SZ ( 2 ) -#define FW_REG_SDFM_CFG_OC_LOW_THR_SZ ( 2 ) -#define FW_REG_SDFM_CFG_ZC_ENABLE_SZ ( 2 ) -#define FW_REG_SDFM_CFG_ZC_THR_SZ ( 4 ) -#define FW_REG_SDFM_CFG_ZC_TRIP_STATUS_SZ ( 1 ) -#define FW_REG_SDFM_CFG_ZC_PREV_VAL_SZ ( 4 ) -#define FW_REG_SDDF_CFG_OSR_SZ ( 1 ) -#define FW_REG_SDDF_CFG_TRIG_SAMPLE_TIME_SZ ( 4 ) -#define FW_REG_SDDF_CFG_TRIG_SAMPLE_CNT_SZ ( 2 ) -#define FW_REG_SDDF_CFG_NC_PRD_IEP_CNT_SZ ( 2 ) -#define FW_REG_SDDF_CFG_OC_PRD_IEP_CNT_SZ ( 2 ) -#define FW_REG_SDDF_CFG_IEP_CFG_SIM_EPWM_PRD_SZ ( 4 ) -#define FW_REG_SDDF_CFG_OUT_SAMP_BUF_SZ ( 4 ) -#define FW_REG_SDFM_CFG_GPIO_VALUE_SZ ( 4 ) -#define FW_REG_SDFM_CFG_GPIO_SET_ADDR_SZ ( 4 ) -#define FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ ( 4 ) -#define FW_REG_SDFM_CFG_CURR_VAL_SZ ( 4 ) - -/* FW register offsets from base (in bytes) */ -/* SDDF Control */ -#define FW_REG_SDDF_CTRL_OFFSET ( 0x00 ) -#define FW_REG_SDDF_STAT_OFFSET ( 0x01 ) - -/* SDDF Configuration */ -#define FW_REG_SDDF_CFG_IEP_CFG_OFFSET ( 0x00 ) -#define FW_REG_SDDF_CFG_IEP_CFG_SIM_EPWM_PRD_OFFSET ( 0x06 ) -#define FW_REG_SDDF_CFG_SD_CLK_OFFSET ( 0x0A ) -#define FW_REG_SDDF_CFG_SD_CH_ID_OFFSET ( 0x0E ) -#define FW_REG_SDFM_CFG_SD_EN_COMP_OFFSET ( 0x12 ) -#define FW_REG_SDFM_CFG_SD_ZC_ENABLE_OFFSET ( 0x16 ) -#define FW_REG_SDFM_CFG_ZC_START_SZ ( 0x18 ) - -/*SDFM channel offsets*/ -/*ch0 offset*/ -#define FW_REG_SDDF_CFG_CH0_CH_ID_OFFSET ( 0x1A ) -#define FW_REG_SDDF_CFG_CH0_FILTER_TYPE_OFFSET ( 0x1B ) -#define FW_REG_SDDF_CFG_CH0_OSR_OFFSET ( 0x1C ) -#define FW_REG_SDFM_CFG_OC_HIGH_THR_CH0_OFFSET ( 0x1E ) -#define FW_REG_SDFM_CFG_OC_LOW_THR_CH0_OFFSET ( 0x22 ) -#define FW_REG_SDFM_CFG_OC_ZC_THR_CH0_OFFSET ( 0x26 ) -#define FW_REG_SDFM_CFG_ZC_TRIP_STATUS_CH0_OFFSET ( 0x2A ) -#define SDFM_CFG_ZC_CH0_PREV_VAL_OFFSET ( 0x2E ) -#define FW_REG_SDDF_CFG_CH0_CLOCK_SOURCE_OFFSET ( 0x32 ) -#define FW_REG_SDDF_CFG_CH0_CLOCK_INVERSION_OFFSET ( 0x36 ) -#define SDFM_CFG_HIGH_THR_CH0_WRITE_VAL_OFFSET ( 0x3A ) -#define SDFM_CFG_HIGH_THR_CH0_SET_VAL_ADDR_OFFSET ( 0x3E ) -#define SDFM_CFG_HIGH_THR_CH0_CLR_VAL_ADDR_OFFSET ( 0x42 ) -#define SDFM_CFG_LOW_THR_CH0_WRITE_VAL_OFFSET ( 0x46 ) -#define SDFM_CFG_LOW_THR_CH0_SET_VAL_ADDR_OFFSET ( 0x4A ) -#define SDFM_CFG_LOW_THR_CH0_CLR_VAL_ADDR_OFFSET ( 0x4E ) -#define SDFM_CFG_ZC_THR_CH0_WRITE_VAL_OFFSET ( 0x52 ) -#define SDFM_CFG_ZC_THR_CH0_SET_VAL_ADDR_OFFSET ( 0x56 ) -#define SDFM_CFG_ZC_THR_CH0_CLR_VAL_ADDR_OFFSET ( 0x5A ) - -/*ch1 offsets*/ -#define FW_REG_SDDF_CFG_CH1_CH_ID_OFFSET ( 0x5E ) -#define FW_REG_SDDF_CFG_CH1_FILTER_TYPE_OFFSET ( 0x5F ) -#define FW_REG_SDDF_CFG_CH1_OSR_OFFSET ( 0x60 ) -#define FW_REG_SDFM_CFG_OC_HIGH_THR_CH1_OFFSET ( 0x62 ) -#define FW_REG_SDFM_CFG_OC_LOW_THR_CH1_OFFSET ( 0x66 ) -#define FW_REG_SDFM_CFG_OC_ZC_THR_CH1_OFFSET ( 0x6A ) -#define FW_REG_SDFM_CFG_ZC_TRIP_STATUS_CH1_OFFSET ( 0x6E ) -#define SDFM_CFG_ZC_CH1_PREV_VAL_OFFSET ( 0x72 ) -#define FW_REG_SDDF_CFG_CH1_CLOCK_SOURCE_OFFSET ( 0x76 ) -#define FW_REG_SDDF_CFG_CH1_CLOCK_INVERSION_OFFSET ( 0x7A ) -#define SDFM_CFG_HIGH_THR_CH1_WRITE_VAL_OFFSET ( 0x7E ) -#define SDFM_CFG_HIGH_THR_CH1_SET_VAL_ADDR_OFFSET ( 0x82 ) -#define SDFM_CFG_HIGH_THR_CH1_CLR_VAL_ADDR_OFFSET ( 0x86 ) -#define SDFM_CFG_LOW_THR_CH1_WRITE_VAL_OFFSET ( 0x8A ) -#define SDFM_CFG_LOW_THR_CH1_SET_VAL_ADDR_OFFSET ( 0x8E ) -#define SDFM_CFG_LOW_THR_CH1_CLR_VAL_ADDR_OFFSET ( 0x92 ) -#define SDFM_CFG_ZC_THR_CH1_WRITE_VAL_OFFSET ( 0x96 ) -#define SDFM_CFG_ZC_THR_CH1_SET_VAL_ADDR_OFFSET ( 0x9A ) -#define SDFM_CFG_ZC_THR_CH1_CLR_VAL_ADDR_OFFSET ( 0x9E ) - - -/*ch2 offsets*/ -#define FW_REG_SDDF_CFG_CH2_CH_ID_OFFSET ( 0xA2 ) -#define FW_REG_SDDF_CFG_CH2_FILTER_TYPE_OFFSET ( 0xA3 ) -#define FW_REG_SDDF_CFG_CH2_OSR_OFFSET ( 0xA4 ) -#define FW_REG_SDFM_CFG_OC_HIGH_THR_CH2_OFFSET ( 0xA6 ) -#define FW_REG_SDFM_CFG_OC_LOW_THR_CH2_OFFSET ( 0xAA ) -#define FW_REG_SDFM_CFG_OC_ZC_THR_CH2_OFFSET ( 0xAE ) -#define FW_REG_SDFM_CFG_ZC_TRIP_STATUS_CH2_OFFSET ( 0xB2 ) -#define SDFM_CFG_ZC_CH2_PREV_VAL_OFFSET ( 0xB6 ) -#define FW_REG_SDDF_CFG_CH2_CLOCK_SOURCE_OFFSET ( 0xBA ) -#define FW_REG_SDDF_CFG_CH2_CLOCK_INVERSION_OFFSET ( 0xBE ) -#define SDFM_CFG_HIGH_THR_CH2_WRITE_VAL_OFFSET ( 0xC2 ) -#define SDFM_CFG_HIGH_THR_CH2_SET_VAL_ADDR_OFFSET ( 0xC6 ) -#define SDFM_CFG_HIGH_THR_CH2_CLR_VAL_ADDR_OFFSET ( 0xCA ) -#define SDFM_CFG_LOW_THR_CH2_WRITE_VAL_OFFSET ( 0xCE ) -#define SDFM_CFG_LOW_THR_CH2_SET_VAL_ADDR_OFFSET ( 0xD2 ) -#define SDFM_CFG_LOW_THR_CH2_CLR_VAL_ADDR_OFFSET ( 0xD6 ) -#define SDFM_CFG_ZC_THR_CH2_WRITE_VAL_OFFSET ( 0xDA) -#define SDFM_CFG_ZC_THR_CH2_SET_VAL_ADDR_OFFSET ( 0xDE ) -#define SDFM_CFG_ZC_THR_CH2_CLR_VAL_ADDR_OFFSET ( 0xE2 ) - -/*sample timing offset*/ -#define FW_REG_SDDF_CFG_TRIG_SAMPLE_TIME_OFFSET ( 0xE6 ) -#define FW_REG_SDDF_CFG_OC_PRD_IEP_CNT_OFFSET ( 0xEA ) -#define FW_REG_SDDF_CFG_NC_PRD_IEP_CNT_OFFSET ( 0xEC ) -#define FW_REG_SDDF_CFG_SAMPLE_COUNT ( 0xEE ) -/*Sample output offset*/ -#define FW_REG_SDDF_CFG_OUT_SAMP_BUF_OFFSET ( 0xF2 ) - - -/*Debug Offset */ -#define DUBG_OFFSET (0x110) - -/* FW register addresses */ - -/* Sigma Delta Filter Control */ -#define FW_REG_SDDF_CTRL ( ICSSG_SDDF_CTRL_BASE + FW_REG_SDDF_CTRL_OFFSET ) -/* Sigma Delta Filter Status */ -#define FW_REG_SDDF_STAT ( ICSSG_SDDF_CTRL_BASE + FW_REG_SDDF_STAT_OFFSET ) - -/* Sigma Delta Filter Configuration, IEP configuration */ -#define FW_REG_SDDF_CFG_IEP_CFG ( ICSSG_SDDF_CFG_BASE + FW_REG_SDDF_CFG_IEP_CFG_OFFSET ) -/* Sigma Delta Filter Configuration, IEP CMP0 count for simulated EPWM period */ -#define FW_REG_SDDF_CFG_IEP_CFG_SIM_EPWM_PRD ( ICSSG_SDDF_CFG_BASE + FW_REG_SDDF_CFG_IEP_CFG_SIM_EPWM_PRD_OFFSET ) -/* Sigma Delta Filter Configuration, SD channel IDs */ -#define FW_REG_SDDF_CFG_SD_CH_ID ( ICSSG_SDDF_CFG_BASE + FW_REG_SDDF_CFG_SD_CH_ID_OFFSET ) -/* Sigma Delta Filter Configuration, SD clock */ -#define FW_REG_SDDF_CFG_SD_CLK ( ICSSG_SDDF_CFG_BASE + FW_REG_SDDF_CFG_SD_CLK_OFFSET ) -/* Sigma Delta Filter Configuration, OSR */ -#define FW_REG_SDDF_CFG_OSR ( ICSSG_SDDF_CFG_BASE + FW_REG_SDDF_CFG_OSR_OFFSET ) -/* Sigma Delta Filter Configuration, positive threshold for OC detect */ -#define FW_REG_SDDF_CFG_OC_POS_THR ( ICSSG_SDDF_CFG_BASE + FW_REG_SDDF_CFG_OC_POS_THR_OFFSET ) -/* Sigma Delta Filter Configuration, negative threshold for OC detect */ -#define FW_REG_SDDF_CFG_OC_NEG_THR ( ICSSG_SDDF_CFG_BASE + FW_REG_SDDF_CFG_OC_NEG_THR_OFFSET ) -/* Sigma Delta Filter Configuration, Trigger Sample Time */ -#define FW_REG_SDDF_CFG_TRIG_SAMPLE_TIME ( ICSSG_SDDF_CFG_BASE + FW_REG_SDDF_CFG_TRIG_SAMPLE_TIME_OFFSET ) -/* Sigma Delta Filter Configuration, Trigger Sample Count */ -#define FW_REG_SDDF_CFG_OC_PRD_IEP_CNT ( ICSSG_SDDF_CFG_BASE + FW_REG_SDDF_CFG_OC_PRD_IEP_CNT_OFFSET ) -/* Sigma Delta Filter Configuration, NC sampling period IEP counts */ -#define FW_REG_SDDF_CFG_NC_PRD_IEP_CNT ( ICSSG_SDDF_CFG_BASE + FW_REG_SDDF_CFG_NC_PRD_IEP_CNT_OFFSET ) -/* Sigma Delta Filter Configuration, Host Sample Output Buffer */ -#define FW_REG_SDDF_CFG_OUT_SAMP_BUF ( ICSSG_SDDF_CFG_BASE + FW_REG_SDDF_CFG_OUT_SAMP_BUF_OFFSET ) - -/* - Firmware register bit fields -*/ - -/* SDDF_CTRL */ -#define BF_SDDF_EN_MASK ( 0x1 ) -#define BF_PRU_ID_MASK ( 0x3 ) -#define SDDF_CTRL_BF_SDDF_EN_SHIFT ( 0 ) -#define SDDF_CTRL_BF_SDDF_EN_MASK ( BF_SDDF_EN_MASK << SDDF_CTRL_BF_SDDF_EN_SHIFT ) -#define SDDF_CTRL_BF_PRU_ID_SHIFT ( 1 ) -#define SDDF_CTRL_BF_PRU_ID_MASK ( BF_PRU_ID_MASK << SDDF_CTRL_BF_PRU_ID_SHIFT ) -/* SDDF_EN bit field */ -#define BF_SDDF_EN_DISABLE ( 0 ) -#define BF_SDDF_EN_ENABLE ( 1 ) -/* PRU ID bit field */ -#define BF_PRU_ID_0 ( 0 ) -#define BR_PRU_ID_1 ( 1 ) -#define BF_PRU_ID_UNINIT ( 2 ) - -/* SDDF_STAT */ -#define BF_SDDF_EN_ACK_MASK ( 0x1 ) -#define BF_PRU_ID_ACK_MASK ( 0x3 ) -#define SDDF_STAT_BF_SDDF_EN_ACK_SHIFT ( 0 ) -#define SDDF_STAT_BF_SDDF_EN_ACK_MASK ( BF_SDDF_EN_ACK_MASK << SDDF_STAT_BF_SDDF_EN_ACK_SHIFT ) -#define SDDF_STAT_BF_PRU_ID_ACK_SHIFT ( 1 ) -#define SDDF_STAT_BF_PRU_ID_ACK_MASK ( BF_PRU_ID_ACK_MASK << SDDF_STAT_BF_PRU_ID_ACK_SHIFT ) - -/* IEP_CFG */ -#define BF_IEP_DEFAULT_INC_MASK ( 0xF ) -#define IEP_CFG_BF_IEP_DEFAULT_INC_SHIFT ( 0 ) -#define IEP_CFG_BF_IEP_DEFAULT_INC_MASK ( BF_IEP_DEFAULT_INC_MASK << IEP_CFG_BF_IEP_DEFAULT_INC_SHIFT ) - -/* IEP_CFG_EPWM_PRD */ -#define BF_CMP0_CNT_EPWM_PRD_MASK ( 0xFFFFFFFF ) -#define IEP_CFG_BF_CMP0_CNT_EPWM_PRD_SHIFT ( 0 ) -#define IEP_CFG_BF_CMP0_CNT_EPWM_PRD_MASK ( BF_CMP0_CNT_EPWM_PRD_MASK << IEP_CFG_BF_CMP0_CNT_EPWM_PRD_SHIFT ) - -/* SDDF_CFG_SD_CH_ID */ -#define BF_SD_CH0_ID_MASK ( 0xF ) -#define BF_SD_CH1_ID_MASK ( 0xF ) -#define BF_SD_CH2_ID_MASK ( 0xF ) -#define SDDF_CFG_BF_SD_CH0_ID_SHIFT ( 0 ) -#define SDDF_CFG_BF_SD_CH1_ID_SHIFT ( 4 ) -#define SDDF_CFG_BF_SD_CH2_ID_SHIFT ( 8 ) -#define SDDF_CFG_BF_SD_CH0_ID_MASK ( BF_SD_CH0_ID_MASK << SDDF_CFG_BF_SD_CH0_ID_SHIFT ) -#define SDDF_CFG_BF_SD_CH1_ID_MASK ( BF_SD_CH1_ID_MASK << SDDF_CFG_BF_SD_CH1_ID_SHIFT ) -#define SDDF_CFG_BF_SD_CH2_ID_MASK ( BF_SD_CH2_ID_MASK << SDDF_CFG_BF_SD_CH2_ID_SHIFT ) - -/* SDDF_CFG_SD_CLK */ -#define BF_SD_PRD_CLOCKS_MASK ( 0xFF ) -#define BF_SD_CLK_INV_MASK ( 0x1 ) -#define SDDF_CFG_SD_CLK_BF_SD_PRD_CLOCKS_SHIFT ( 0 ) -#define SDDF_CFG_SD_CLK_BF_SD_PRD_CLOCKS_MASK ( BF_SD_PRD_CLOCKS_MASK << SDDF_CFG_SD_CLK_BF_SD_PRD_CLOCKS_SHIFT ) -#define SDDF_CFG_SD_CLK_BF_SD_CLK_INV_SHIFT ( 8 ) -#define SDDF_CFG_SD_CLK_BF_SD_CLK_INV_MASK ( BF_SD_CLK_INV_MASK << SDDF_CFG_SD_CLK_BF_SD_CLK_INV_SHIFT ) - -/* SDDF_CFG_OSR */ -#define BF_OC_OSR_MASK ( 0xFF ) -#define SDDF_CFG_OC_OSR_BF_OSR_SHIFT ( 0 ) -#define SDDF_CFG_OC_OSR_BF_OSR_MASK ( BF_OC_OSR_MASK << SDDF_CFG_OC_OSR_BF_OSR_SHIFT ) - -/* SDDF_CFG_OC_POS_THR */ -#define BF_OC_POS_THR_MASK ( 0xFF ) -#define SDDF_CFG_OC_POS_THR_SHIFT ( 0 ) -#define SDDF_CFG_OC_POS_THR_MASK ( BF_OC_POS_THR_MASK << SDDF_CFG_OC_POS_THR_SHIFT ) - -/* SDDF_CFG_OC_NEG_THR */ -#define BF_OC_NEG_THR_MASK ( 0xFF ) -#define SDDF_CFG_OC_NEG_THR_SHIFT ( 0 ) -#define SDDF_CFG_OC_NEG_THR_MASK ( BF_OC_NEG_THR_MASK << SDDF_CFG_OC_NEG_THR_SHIFT ) - -/* SDFM_CFG_SD_EN_COMP */ -#define SDFM_CFG_BF_SD_CH0_EN_COMP_BIT ( 0x00 ) -#define SDFM_CFG_BF_SD_CH1_EN_COMP_BIT ( 0x01 ) -#define SDFM_CFG_BF_SD_CH2_EN_COMP_BIT ( 0x02 ) - -/* SDFM_CFG_ZC_ENABLE */ -#define SDFM_CFG_BF_SD_CH0_ZC_ENABLE_BIT ( 0x00 ) -#define SDFM_CFG_BF_SD_CH1_ZC_ENABLE_BIT ( 0x01 ) -#define SDFM_CFG_BF_SD_CH2_ZC_ENABLE_BIT ( 0x02 ) - - -/* SDFM_CFG_ZC_START */ -#define SDFM_CFG_BF_SD_CH0_ZC_START_BIT ( 0x00 ) -#define SDFM_CFG_BF_SD_CH1_ZC_START_BIT ( 0x01 ) -#define SDFM_CFG_BF_SD_CH2_ZC_START_BIT ( 0x02 ) - - -/* SDFM_CFG_TRIP_STATUS */ -#define SDFM_CFG_BF_SD_TRIP_STATUS_HIGH ( 0x01 ) -#define SDFM_CFG_BF_SD_TRIP_STATUS_LOW ( 0x00 ) - - -/* SDDF_CFG_TRIG_SAMP_TIME */ -#define BF_TRIG_SAMP_TIME_MASK ( 0xFFFF ) -#define SDDF_CFG_TRIG_SAMP_TIME_BF_TRIG_SAMP_TIME_SHIFT \ - ( 0 ) -#define SDDF_CFG_TRIG_SAMP_TIME_BF_TRIG_SAMP_TIME_MASK \ - ( BF_TRIG_SAMP_TIME_MASK << SDDF_CFG_TRIG_SAMP_TIME_BF_TRIG_SAMP_TIME_SHIFT ) - -/* SDDF_CFG_TRIG_SAMPLE_CNT */ -#define BF_TRIG_SAMP_CNT_MASK ( 0xFFFF ) -#define SDDF_CFG_TRIG_SAMP_CNT_BF_TRIG_SAMP_CNT_SHIFT \ - ( 0 ) -#define SDDF_CFG_TRIG_SAMP_CNT_BF_TRIG_SAMP_CNT_MASK \ - ( BF_TRIG_SAMP_CNT_MASK << SDDF_CFG_TRIG_SAMP_CNT_BF_TRIG_SAMP_CNT_SHIFT ) - -/* SDDF_CFG_NC_PRD_IEP_CNT */ -#define BF_NC_PRD_IEP_CNT_MASK ( 0xFF ) -#define SDDF_CFG_NC_PRD_IEP_CNT_SHIFT ( 0 ) -#define SDDF_CFG_NC_PRD_IEP_CNT_MASK ( BF_NC_PRD_IEP_CNT_MASK << SDDF_CFG_NC_PRD_IEP_CNT_SHIFT ) - -/* SDDF_CFG_NC_OUT_SAMP_BUF */ -#define BF_NC_OUT_SAMP_BUF_MASK ( 0xFFFF ) -#define SDDF_CFG_NC_OUT_SAMP_BUF_BF_NC_OUT_SAMP_BUF_SHIFT \ - ( 0 ) -#define SDDF_CFG_NC_OUT_SAMP_BUF_BF_NC_OUT_SAMP_BUF_MASK \ - ( BF_NC_OUT_SAMP_BUF_MASK << SDDF_CFG_NC_OUT_SAMP_BUF_BF_NC_OUT_SAMP_BUF_SHIFT ) - -#endif \ No newline at end of file diff --git a/source/current_sense/sdfm/firmware/icssg_sdfm.h b/source/current_sense/sdfm/firmware/icssg_sdfm.h new file mode 100644 index 0000000..0f307d4 --- /dev/null +++ b/source/current_sense/sdfm/firmware/icssg_sdfm.h @@ -0,0 +1,328 @@ +/* + * Copyright (c) 2023, Texas Instruments Incorporated + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _ICSS_SDFM_H_ +#define _ICSS_SDFM_H_ + +/* Number of SDFM channels per PRU */ +#define ICSSG_NUM_SD_CH ( 9 ) +/* Number of SDFM channels supported by PRU FW */ +#define ICSSG_NUM_SD_CH_FW ( 3 ) + +/* ICSSG INTC events */ +/* Compile-time Host event for SDFM samples available. + Ideally Host would provide this to FW via pseudo-register in DMEM. */ +#define PRU_TRIGGER_HOST_SDFM_EVT ( 2+16 ) /* pr0_pru_mst_intr[2]_intr_req */ +#define RTU_TRIGGER_HOST_SDFM_EVT ( 3+16 ) /* pr0_pru_mst_intr[3]_intr_req */ + + +/* + Firmware registers +*/ + +/* FW register base addresses */ +#define PRU0_DMEM ( 0x0000 ) + + + +/* Base address for SDFM control parameters in DMEM */ +#define ICSSG_SDFM_CTRL_BASE ( PRU0_DMEM ) +/* Base address for SDFM Configuration parameters in DMEM */ +#define ICSSG_SDFM_CFG_BASE ( PRU0_DMEM + 0x0002) + + +/* FW register sizes (in bytes) */ +/* SDFM ENABLE */ +#define SDFM_EN_SZ ( 1 ) +/* SDFM ENABLE ACK*/ +#define SDFM_EN_ACK_SZ ( 1 ) +#define SDFM_PRU_ID_SZ ( 1 ) + +/* SDFM Configuration */ +#define SDFM_CFG_IEP_CFG_SZ ( 1 ) +#define SDFM_CFG_IEP_CFG_SIM_EPWM_PRD_SZ ( 4 ) + +#define SDFM_CFG_SD_CH_ID_SZ ( 4 ) +#define SDFM_CFG_EN_COMP_SZ ( 2 ) + +#define SDFM_CFG_SD_CLK_SZ ( 2 ) + +#define SDFM_CFG_OSR_SZ ( 1 ) +#define SDFM_CFG_OC_HIGH_THR_SZ ( 4 ) +#define SDFM_CFG_OC_LOW_THR_SZ ( 4 ) + + + +#define SDFM_CFG_TRIG_SAMPLE_TIME_SZ ( 4 ) +#define SDFM_CFG_TRIG_SAMPLE_CNT_SZ ( 2 ) +#define SDFM_CFG_NC_PRD_IEP_CNT_SZ ( 2 ) +#define SDFM_CFG_OC_PRD_IEP_CNT_SZ ( 2 ) + +#define SDFM_CFG_OUT_SAMP_BUF_SZ ( 4 ) +#define SDFM_CFG_GPIO_VALUE_SZ ( 4 ) +#define SDFM_CFG_GPIO_SET_ADDR_SZ ( 4 ) +#define SDFM_CFG_GPIO_CLR_ADDR_SZ ( 4 ) +#define SDFM_CFG_CURR_VAL_SZ ( 4 ) + +/* FW register offsets from base (in bytes) */ +/* SDFM Control */ +#define SDFM_EN_OFFSET ( 0x00 ) +#define SDFM_EN_ACK_OFFSET ( 0x01 ) +#define SDFM_PRU_ID_OFFSET ( 0x02 ) + +/* SDFM IEP Configuration */ +#define SDFM_CFG_IEP_CFG_OFFSET ( 0x04 ) +#define SDFM_CFG_IEP_INC_OFFSET ( 0x04 ) +#define SDFM_CFG_IEP_CFG_SIM_EPWM_PRD_OFFSET ( 0x08 ) + +/* SDFM Clock Configuration*/ +#define SDFM_CFG_SD_CLK_OFFSET ( 0x0C ) +#define SDFM_CFG_SD_CLK_INV_OFFSET ( 0x0D ) + +/* SDFM Configuration*/ +#define SDFM_CFG_SD_CH_ID_OFFSET ( 0x10 ) +#define SDFM_CFG_SD_EN_COMP_OFFSET ( 0x14 ) +#define SDFM_CFG_SD_ZC_ENABLE_OFFSET ( 0x16 ) + + +/*SDFM channel offsets*/ +/*ch0 offset*/ +#define SDFM_CFG_CH0_CH_ID_OFFSET ( 0x1C ) +#define SDFM_CFG_CH0_FILTER_TYPE_OFFSET ( 0x1D ) +#define SDFM_CFG_CH0_OSR_OFFSET ( 0x1E ) + +#define SDFM_CFG_OC_HIGH_THR_CH0_OFFSET ( 0x20 ) +#define SDFM_CFG_OC_LOW_THR_CH0_OFFSET ( 0x24 ) + +#define SDFM_CFG_CH0_FD_WD_REG_OFFSET ( 0x2C) +#define SDFM_CFG_CH0_FD_ZERO_MAX_REG_OFFSET ( 0x2D) +#define SDFM_CFG_CH0_FD_ZERO_MIN_REG_OFFSET ( 0x2E) +#define SDFM_CFG_CH0_FD_ONE_MAX_REG_OFFSET ( 0x2F) +#define SDFM_CFG_CH0_FD_ONE_MIN_REG_OFFSET ( 0x30) + +#define SDFM_CFG_CH0_CLOCK_SOURCE_OFFSET ( 0x34 ) +#define SDFM_CFG_CH0_CLOCK_INVERSION_OFFSET ( 0x38 ) + +#define SDFM_CFG_HIGH_THR_CH0_WRITE_VAL_OFFSET ( 0x3C ) +#define SDFM_CFG_HIGH_THR_CH0_SET_VAL_ADDR_OFFSET ( 0x40 ) +#define SDFM_CFG_HIGH_THR_CH0_CLR_VAL_ADDR_OFFSET ( 0x44 ) +#define SDFM_CFG_LOW_THR_CH0_WRITE_VAL_OFFSET ( 0x48 ) +#define SDFM_CFG_LOW_THR_CH0_SET_VAL_ADDR_OFFSET ( 0x4C ) +#define SDFM_CFG_LOW_THR_CH0_CLR_VAL_ADDR_OFFSET ( 0x50 ) + + +/*ch1 offsets*/ +#define SDFM_CFG_CH1_CH_ID_OFFSET ( 0x60 ) +#define SDFM_CFG_CH1_FILTER_TYPE_OFFSET ( 0x61 ) +#define SDFM_CFG_CH1_OSR_OFFSET ( 0x62 ) + +#define SDFM_CFG_OC_HIGH_THR_CH1_OFFSET ( 0x64 ) +#define SDFM_CFG_OC_LOW_THR_CH1_OFFSET ( 0x68 ) + +#define SDFM_CFG_CH1_FD_WD_REG_OFFSET ( 0x70 ) +#define SDFM_CFG_CH1_FD_ZERO_MAX_REG_OFFSET ( 0x71 ) +#define SDFM_CFG_CH1_FD_ZERO_MIN_REG_OFFSET ( 0x72 ) +#define SDFM_CFG_CH1_FD_ONE_MAX_REG_OFFSET ( 0x73 ) +#define SDFM_CFG_CH1_FD_ONE_MIN_REG_OFFSET ( 0x74 ) + +#define SDFM_CFG_CH1_CLOCK_SOURCE_OFFSET ( 0x78 ) +#define SDFM_CFG_CH1_CLOCK_INVERSION_OFFSET ( 0x7C ) + +#define SDFM_CFG_HIGH_THR_CH1_WRITE_VAL_OFFSET ( 0x80 ) +#define SDFM_CFG_HIGH_THR_CH1_SET_VAL_ADDR_OFFSET ( 0x84 ) +#define SDFM_CFG_HIGH_THR_CH1_CLR_VAL_ADDR_OFFSET ( 0x88 ) +#define SDFM_CFG_LOW_THR_CH1_WRITE_VAL_OFFSET ( 0x8C ) +#define SDFM_CFG_LOW_THR_CH1_SET_VAL_ADDR_OFFSET ( 0x90 ) +#define SDFM_CFG_LOW_THR_CH1_CLR_VAL_ADDR_OFFSET ( 0x94 ) + + + +/*ch2 offsets*/ +#define SDFM_CFG_CH2_CH_ID_OFFSET ( 0xA4 ) +#define SDFM_CFG_CH2_FILTER_TYPE_OFFSET ( 0xA5 ) +#define SDFM_CFG_CH2_OSR_OFFSET ( 0xA6 ) + +#define SDFM_CFG_OC_HIGH_THR_CH2_OFFSET ( 0xA8 ) +#define SDFM_CFG_OC_LOW_THR_CH2_OFFSET ( 0xAC ) + +#define SDFM_CFG_CH2_FD_WD_REG_OFFSET ( 0xB4 ) +#define SDFM_CFG_CH2_FD_ZERO_MAX_REG_OFFSET ( 0xB5 ) +#define SDFM_CFG_CH2_FD_ZERO_MIN_REG_OFFSET ( 0xB6 ) +#define SDFM_CFG_CH2_FD_ONE_MAX_REG_OFFSET ( 0xB7 ) +#define SDFM_CFG_CH2_FD_ONE_MIN_REG_OFFSET ( 0xB8 ) + + +#define SDFM_CFG_CH2_CLOCK_SOURCE_OFFSET ( 0xBC ) +#define SDFM_CFG_CH2_CLOCK_INVERSION_OFFSET ( 0xC0 ) + +#define SDFM_CFG_HIGH_THR_CH2_WRITE_VAL_OFFSET ( 0xC4 ) +#define SDFM_CFG_HIGH_THR_CH2_SET_VAL_ADDR_OFFSET ( 0xC8 ) +#define SDFM_CFG_HIGH_THR_CH2_CLR_VAL_ADDR_OFFSET ( 0xCC ) +#define SDFM_CFG_LOW_THR_CH2_WRITE_VAL_OFFSET ( 0xD0 ) +#define SDFM_CFG_LOW_THR_CH2_SET_VAL_ADDR_OFFSET ( 0xD4 ) +#define SDFM_CFG_LOW_THR_CH2_CLR_VAL_ADDR_OFFSET ( 0xD8 ) + + +/*sample timing offset*/ +#define SDFM_CFG_EN_DOUBLE_UPDATE ( 0xE8 ) +#define FW_REG_SDFM_CFG_FIRST_TRIG_SAMPLE_TIME ( 0xEC ) +#define FW_REG_SDFM_CFG_SECOND_TRIG_SAMPLE_TIME ( 0xF0 ) +#define SDFM_CFG_NC_PRD_IEP_CNT_OFFSET ( 0xF4) + +/*Sample output offset*/ +#define SDFM_CFG_OUT_SAMP_BUF_OFFSET ( 0xF8 ) + +/*Debug */ +#define SDFM_DUBUG_OFFSET ( 0x104 ) + +/* + Firmware register bit fields +*/ + +/* SDFM_CTRL */ +#define BF_SDFM_EN_MASK ( 0x1 ) +#define BF_PRU_ID_MASK ( 0x3 ) +#define SDFM_CTRL_BF_SDFM_EN_SHIFT ( 0 ) +#define SDFM_CTRL_BF_SDFM_EN_MASK ( BF_SDFM_EN_MASK << SDFM_CTRL_BF_SDFM_EN_SHIFT ) +#define SDFM_CTRL_BF_PRU_ID_SHIFT ( 1 ) +#define SDFM_CTRL_BF_PRU_ID_MASK ( BF_PRU_ID_MASK << SDFM_CTRL_BF_PRU_ID_SHIFT ) +/* SDFM_EN bit field */ +#define BF_SDFM_EN_DISABLE ( 0 ) +#define BF_SDFM_EN_ENABLE ( 1 ) +/* PRU ID bit field */ +#define BF_PRU_ID_0 ( 0 ) +#define BR_PRU_ID_1 ( 1 ) +#define BF_PRU_ID_UNINIT ( 2 ) + +/* SDFM_STAT */ +#define BF_SDFM_EN_ACK_MASK ( 0x1 ) +#define BF_PRU_ID_ACK_MASK ( 0x3 ) +#define SDFM_STAT_BF_SDFM_EN_ACK_SHIFT ( 0 ) +#define SDFM_STAT_BF_SDFM_EN_ACK_MASK ( BF_SDFM_EN_ACK_MASK << SDFM_STAT_BF_SDFM_EN_ACK_SHIFT ) +#define SDFM_STAT_BF_PRU_ID_ACK_SHIFT ( 1 ) +#define SDFM_STAT_BF_PRU_ID_ACK_MASK ( BF_PRU_ID_ACK_MASK << SDFM_STAT_BF_PRU_ID_ACK_SHIFT ) + +/* IEP_CFG */ +#define BF_IEP_DEFAULT_INC_MASK ( 0xF ) +#define IEP_CFG_BF_IEP_DEFAULT_INC_SHIFT ( 0 ) +#define IEP_CFG_BF_IEP_DEFAULT_INC_MASK ( BF_IEP_DEFAULT_INC_MASK << IEP_CFG_BF_IEP_DEFAULT_INC_SHIFT ) + +/* IEP_CFG_EPWM_PRD */ +#define BF_CMP0_CNT_EPWM_PRD_MASK ( 0xFFFFFFFF ) +#define IEP_CFG_BF_CMP0_CNT_EPWM_PRD_SHIFT ( 0 ) +#define IEP_CFG_BF_CMP0_CNT_EPWM_PRD_MASK ( BF_CMP0_CNT_EPWM_PRD_MASK << IEP_CFG_BF_CMP0_CNT_EPWM_PRD_SHIFT ) + +/* SDFM_CFG_SD_CH_ID */ +#define BF_SD_CH0_ID_MASK ( 0xF ) +#define BF_SD_CH1_ID_MASK ( 0xF ) +#define BF_SD_CH2_ID_MASK ( 0xF ) +#define SDFM_CFG_BF_SD_CH0_ID_SHIFT ( 0 ) +#define SDFM_CFG_BF_SD_CH1_ID_SHIFT ( 4 ) +#define SDFM_CFG_BF_SD_CH2_ID_SHIFT ( 8 ) +#define SDFM_CFG_BF_SD_CH0_ID_MASK ( BF_SD_CH0_ID_MASK << SDFM_CFG_BF_SD_CH0_ID_SHIFT ) +#define SDFM_CFG_BF_SD_CH1_ID_MASK ( BF_SD_CH1_ID_MASK << SDFM_CFG_BF_SD_CH1_ID_SHIFT ) +#define SDFM_CFG_BF_SD_CH2_ID_MASK ( BF_SD_CH2_ID_MASK << SDFM_CFG_BF_SD_CH2_ID_SHIFT ) + +/* SDFM_CFG_SD_CLK */ +#define BF_SD_PRD_CLOCKS_MASK ( 0xFF ) +#define BF_SD_CLK_INV_MASK ( 0x1 ) +#define SDFM_CFG_SD_CLK_BF_SD_PRD_CLOCKS_SHIFT ( 0 ) +#define SDFM_CFG_SD_CLK_BF_SD_PRD_CLOCKS_MASK ( BF_SD_PRD_CLOCKS_MASK << SDFM_CFG_SD_CLK_BF_SD_PRD_CLOCKS_SHIFT ) +#define SDFM_CFG_SD_CLK_BF_SD_CLK_INV_SHIFT ( 8 ) +#define SDFM_CFG_SD_CLK_BF_SD_CLK_INV_MASK ( BF_SD_CLK_INV_MASK << SDFM_CFG_SD_CLK_BF_SD_CLK_INV_SHIFT ) + +/* SDFM_CFG_OSR */ +#define BF_OC_OSR_MASK ( 0xFF ) +#define SDFM_CFG_OC_OSR_BF_OSR_SHIFT ( 0 ) +#define SDFM_CFG_OC_OSR_BF_OSR_MASK ( BF_OC_OSR_MASK << SDFM_CFG_OC_OSR_BF_OSR_SHIFT ) + +/* SDFM_CFG_OC_POS_THR */ +#define BF_OC_POS_THR_MASK ( 0xFF ) +#define SDFM_CFG_OC_POS_THR_SHIFT ( 0 ) +#define SDFM_CFG_OC_POS_THR_MASK ( BF_OC_POS_THR_MASK << SDFM_CFG_OC_POS_THR_SHIFT ) + +/* SDFM_CFG_OC_NEG_THR */ +#define BF_OC_NEG_THR_MASK ( 0xFF ) +#define SDFM_CFG_OC_NEG_THR_SHIFT ( 0 ) +#define SDFM_CFG_OC_NEG_THR_MASK ( BF_OC_NEG_THR_MASK << SDFM_CFG_OC_NEG_THR_SHIFT ) + +/* SDFM_CFG_SD_EN_COMP */ +#define SDFM_CFG_EN_COMP_BIT ( 0x00 ) +#define SDFM_CFG_BF_SD_CH0_EN_COMP_BIT ( 0x01 ) +#define SDFM_CFG_BF_SD_CH1_EN_COMP_BIT ( 0x02 ) +#define SDFM_CFG_BF_SD_CH2_EN_COMP_BIT ( 0x03 ) + +/* SDFM_CFG_ZC_ENABLE */ +#define SDFM_CFG_BF_SD_CH0_ZC_ENABLE_BIT ( 0x00 ) +#define SDFM_CFG_BF_SD_CH1_ZC_ENABLE_BIT ( 0x01 ) +#define SDFM_CFG_BF_SD_CH2_ZC_ENABLE_BIT ( 0x02 ) + + +/* SDFM_CFG_ZC_START */ +#define SDFM_CFG_BF_SD_CH0_ZC_START_BIT ( 0x00 ) +#define SDFM_CFG_BF_SD_CH1_ZC_START_BIT ( 0x01 ) +#define SDFM_CFG_BF_SD_CH2_ZC_START_BIT ( 0x02 ) + + +/* SDFM_CFG_TRIP_STATUS */ +#define SDFM_CFG_BF_SD_TRIP_STATUS_HIGH ( 0x01 ) +#define SDFM_CFG_BF_SD_TRIP_STATUS_LOW ( 0x00 ) + + +/* SDFM_CFG_TRIG_SAMP_TIME */ +#define BF_TRIG_SAMP_TIME_MASK ( 0xFFFF ) +#define SDFM_CFG_TRIG_SAMP_TIME_BF_TRIG_SAMP_TIME_SHIFT \ + ( 0 ) +#define SDFM_CFG_TRIG_SAMP_TIME_BF_TRIG_SAMP_TIME_MASK \ + ( BF_TRIG_SAMP_TIME_MASK << SDFM_CFG_TRIG_SAMP_TIME_BF_TRIG_SAMP_TIME_SHIFT ) + +/* SDFM_CFG_TRIG_SAMPLE_CNT */ +#define BF_TRIG_SAMP_CNT_MASK ( 0xFFFF ) +#define SDFM_CFG_TRIG_SAMP_CNT_BF_TRIG_SAMP_CNT_SHIFT \ + ( 0 ) +#define SDFM_CFG_TRIG_SAMP_CNT_BF_TRIG_SAMP_CNT_MASK \ + ( BF_TRIG_SAMP_CNT_MASK << SDFM_CFG_TRIG_SAMP_CNT_BF_TRIG_SAMP_CNT_SHIFT ) + +/* SDFM_CFG_NC_PRD_IEP_CNT */ +#define BF_NC_PRD_IEP_CNT_MASK ( 0xFF ) +#define SDFM_CFG_NC_PRD_IEP_CNT_SHIFT ( 0 ) +#define SDFM_CFG_NC_PRD_IEP_CNT_MASK ( BF_NC_PRD_IEP_CNT_MASK << SDFM_CFG_NC_PRD_IEP_CNT_SHIFT ) + +/* SDFM_CFG_NC_OUT_SAMP_BUF */ +#define BF_NC_OUT_SAMP_BUF_MASK ( 0xFFFF ) +#define SDFM_CFG_NC_OUT_SAMP_BUF_BF_NC_OUT_SAMP_BUF_SHIFT \ + ( 0 ) +#define SDFM_CFG_NC_OUT_SAMP_BUF_BF_NC_OUT_SAMP_BUF_MASK \ + ( BF_NC_OUT_SAMP_BUF_MASK << SDFM_CFG_NC_OUT_SAMP_BUF_BF_NC_OUT_SAMP_BUF_SHIFT ) + + +#endif \ No newline at end of file diff --git a/source/current_sense/sdfm/firmware/sddf.asm b/source/current_sense/sdfm/firmware/sddf.asm deleted file mode 100644 index 6c71253..0000000 --- a/source/current_sense/sdfm/firmware/sddf.asm +++ /dev/null @@ -1,885 +0,0 @@ -; -; Copyright (c) 2023, Texas Instruments Incorporated -; All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in the -; documentation and/or other materials provided with the distribution. -; -; * Neither the name of Texas Instruments Incorporated nor the names of -; its contributors may be used to endorse or promote products derived -; from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -; EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -; - - .cdecls C,NOLIST -%{ - #include "icssg_sddf.h" -%} - .include "sddf_cfg.h" - .include "sddf.h" - .include "sddf_macros.h" - - -; Compile-time Host event for SDDF samples available -; R31 event interface mapping, add pru_r31_vec_valid to system event number, + 1<<5 - .if $isdefed("SDDF_PRU_CORE") -TRIGGER_HOST_SDDF_IRQ .set PRU_TRIGGER_HOST_SDDF_EVT + 16 - .elseif $isdefed("SDDF_RTU_CORE") -TRIGGER_HOST_SDDF_IRQ .set RTU_TRIGGER_HOST_SDDF_EVT + 16 - .endif - -;SPAD Bank for SD Ch context storage -BANK_CTXT_NC .set BANK0 -BANK_CTXT_OC .set BANK1 -;differentiator state located in BANK locations 9-17 -NUM_REGS_DIFF_STATE .set 9 ; Number of PRU registers for differentiator state -OUT_SAMP_MASK .set 0x0FFFFFFF ; 28-bit mask applied to Integrator & Differentiator output - - -;registers R20 - R24 -;R20: contain address of NC local output -;R21; output mask -;R22.w0 channel ID -;R22.W1 required OC Sample count for NC -;R23 DMEM base address + (0x02) -;R24 PRUx CFG base address - - - ; local interleaved NC output sample buffer -OUT_SAMP_BUF: .usect ".outSamps", ICSSG_NUM_SD_CH_FW*4, 4 - .retain ".outSamps" - .retainrefs ".outSamps" - - .def SDDF_ENTRY ; global entry point - .ref dbg_setup_pinmux - - .sect ".text" - .retain ".text" - .retainrefs ".text" -SDDF_ENTRY: - ; Clear registers R0-R30 - ZERO &R0, 124 - - ; Disable Task Manager - .word 0x32000000 - - ; Clear Task Manager status which is sticky after debug halt - LDI TREG0.w0, 0x0fff - SBCO &TREG0.w0, CT_PRU_ICSSG_TM, 0, 2 - XIN TM_YIELD_XID, &R0.b3,1 - LDI TREG0.w0, 0 - SBCO &TREG0.w0, CT_PRU_ICSSG_TM, 0, 2 - - - ; Write C24 block index for access to FW registers - WRITE_C24_BLK_INDEX C24_BLK_INDEX_FW_REGS_VAL - -; -; Check PRU ID & set PRU ID acknowledge -; -check_pru_id: - ; Wait for Host to update PRU ID - LBCO &TREG0.b0, CT_PRU_ICSSG_LOC_DMEM, FW_REG_SDDF_CTRL, FW_REG_SDDF_CTRL_SZ ; Load TR0.b0 <- FW_REG_SDDF_CTRL - AND TREG0.b0, TREG0.b0, SDDF_CTRL_BF_PRU_ID_MASK ; Mask PRU_ID bit field in TR0.b0 - LDI TREG1.b0, BF_PRU_ID_UNINIT< FW_REG_SDDF_STAT - -; -; Check SDDF global enable & set SDDF global enable acknowledge. -; If SDDF global enable not set, allow re-selection of PRU ID. -; -check_sddf_en: - ; Check SDDF global enable - LBCO &TREG0.b0, CT_PRU_ICSSG_LOC_DMEM, FW_REG_SDDF_CTRL, FW_REG_SDDF_CTRL_SZ ; Load TR0.b0 <- FW_REG_SDDF_CTRL - QBBC check_pru_id, TREG0.b0, SDDF_CTRL_BF_SDDF_EN_SHIFT ; If SDDF_EN not set, re-check PRU_ID - - ; Set SDDF global enable acknowledge - LBCO &TREG0.b0, CT_PRU_ICSSG_LOC_DMEM, FW_REG_SDDF_STAT, FW_REG_SDDF_STAT_SZ ; Load TR0.b0 <- FW_REG_SDDF_STAT - SET TREG0, TREG0, SDDF_CTRL_BF_SDDF_EN_SHIFT ; Set SDDF_EN_ACK bit - SBCO &TREG0.b0, CT_PRU_ICSSG_LOC_DMEM, FW_REG_SDDF_STAT, FW_REG_SDDF_STAT_SZ ; Store FW_REG_SDDF_STAT -> TR0.b0 - -; -; Perform initialization -; -init_sddf: - ; Enable XIN/XOUT shifting. - ; Used for context & SD state save/restore in TM tasks. - LBCO &TREG0.b0, CT_PRU_ICSSG_CFG, ICSSG_CFG_SPPC, 1 - .if $isdefed("SDDF_PRU_CORE") - SET TREG0, TREG0, XFR_SHIFT_EN_BN ; ICSSG_SPP_REG:XFR_SHIFT_EN=1 - .elseif $isdefed("SDDF_RTU_CORE") - SET TREG0, TREG0, RTU_XFR_SHIFT_EN ; ICSSG_SPP_REG:RTU_XFR_SHIFT_EN=1 - .endif - SBCO &TREG0.b0, CT_PRU_ICSSG_CFG, ICSSG_CFG_SPPC, 1 - - ; Initialize Task Manager - JAL RET_ADDR_REG, tm_init - - ; Enable Task Manager - .word 0x32800000 - - .if $isdefed("SDDF_PRU_CORE") ; no IEP on RTU - ; Initialize IEP0 - JAL RET_ADDR_REG, iep0_init - .endif - - - ; Initialize SD mode - LDI32 TREG1, PR1_PRUn_GP_MUX_SEL_VAL<_pru_r31_in[16] Primary Input - JAL RET_ADDR_REG, config_sd_ch - - ; Global enable SD HW, - ; reset SD channel HW - JAL RET_ADDR_REG, reset_sd_ch_hw - SET R30.t25 ; R30[25] channel_en = 1, all channels enabled - - ; Initialize dedicated registers: - ; MASK register, - ; Local NC output sample buffer address, - ; clear sample count - LDI32 MASK_REG, OUT_SAMP_MASK - LDI32 OUT_SAMP_BUF_REG, OUT_SAMP_BUF - LDI SAMP_CNT_REG, 0 - - .if $isdefed("SDDF_PRU_CORE") ; no IEP on RTU - ; Start IEP - LBCO &TREG0.b0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_GLOBAL_CFG_REG, 1 - SET TREG0, TREG0, CNT_ENABLE_BN ; ICSSG_IEP_GLOBAL_CFG_REG:CNT_ENABLE=1 - SBCO &TREG0.b0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_GLOBAL_CFG_REG, 1 - .endif - - ; Generate OC output samples - ; - ; TR0.b0: ch ID - ; TR0.b1: channel ID FW register shift amount - ; TR0.w2: channel ID FW register - - ; Load TR0.w1 <- SDDF_CFG_SD_CH_ID - ;LBBO &TREG0.w2, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_SD_CH_ID_OFFSET, FW_REG_SDDF_CFG_SD_CH_ID_SZ - LBBO &SD_CH_ID, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_SD_CH_ID_OFFSET, FW_REG_SDDF_CFG_SD_CH_ID_SZ - ;LDI TREG0.b1, 0 ; init Ch ID shift - ;LDI TREG1.w2, 0 ; init OC detect count - -Waitloop: - JMP Waitloop - - - -ts1_oc_loop: - - - ; Save/restore context - ; restore differentiator state(R9-R17) - xchg BANK_CTXT_OC, &R9, 4*NUM_REGS_DIFF_STATE - - ; Clear IEP0 CMP4 events - .if $isdefed("SDDF_PRU_CORE") - LDI TREG0.b0, 0x10 - SBCO &TREG0.b0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_CMP_STATUS_REG, 1 - .endif - - .if $isdefed("DEBUG_CODE") - ;Debug code :GPIO HIGH - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH1_SET_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_SET_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH1_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - ;debug code end - .endif - - ; update IEP0 CMP4 - .if $isdefed("SDDF_PRU_CORE") - LDI TREG0,0 - LBCO &TREG0, CT_PRU_ICSSG_LOC_DMEM, FW_REG_SDDF_CFG_OC_PRD_IEP_CNT, FW_REG_SDDF_CFG_OC_PRD_IEP_CNT_SZ - LBCO &TREG1, CT_PRU_ICSSG_IEP0, ICSSG_IEP_CMP4_REG0, 4 ; - MOV CURRENT_COMP4_REG_VALUE, TREG1 ; store current cmp4 register value for check time trigger - ADD TREG0, TREG1, TREG0 - ;read iep counter maximum value - LDI TREG1, 0 - LBCO &TREG1, CT_PRU_ICSSG_LOC_DMEM, FW_REG_SDDF_CFG_IEP_CFG_SIM_EPWM_PRD, 2 - QBLE UPDATE_CMP4_FOR_IEP_RESET, TREG0, TREG1 - ;update Cmp4 with old value + next sample time value - SBCO &TREG0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_CMP4_REG0, 4 - JMP END_CMP4_UPDATE -UPDATE_CMP4_FOR_IEP_RESET: - ;Update cmp4 according to iep reset - SUB TREG0, TREG0, TREG1 - SBCO &TREG0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_CMP4_REG0, 4 - -END_CMP4_UPDATE: - .endif - - ;select ch0, enable all channel, set SD snoop=1 & sample_counter_select=1 - LDI R30.w2, (SD_CH0_ID<<10 | 1<<9 | 1<<6 | 1<<5) - NOP - - ; Snoop read Ch0 sample_counter, - ; wait for ChX sample count+1. - AND TREG1, R31, 0xFF ; snoop read LSB Ch0 sample_counter -wait_sample_count_incr_oc: - AND TREG2, R31, 0xFF ; snoop read LSB Ch0 sample_counter - QBEQ wait_sample_count_incr_oc, TREG2, TREG1 - - ; Snoop read Ch0 ACC3 - CLR R30.t21 ; set SD sample_counter_select=0 - NOP - AND TREG0, R31, MASK_REG ; TREG0 = Ch0 SD HW ACC3 output sample - CLR R30.t22 ; set SD snoop=0 - - ;select ch1, enable all channel & set SD snoop=1 - LDI R30.w2, (SD_CH1_ID<<10 | 1<<9 | 1<<6) - NOP - - ; Snoop read ACC3 for SD Ch1 - AND TREG1, R31, MASK_REG ; TREG1 = Ch1 SD HW ACC3 output sample - CLR R30.t22 ; set SD snoop=0 - - ;select ch2, enable all channel & set SD snoop=1 - LDI R30.w2, (SD_CH2_ID<<10 | 1<<9 | 1<<6) - NOP - - ; Snoop read ACC3 for SD Ch2 - AND TREG2, R31, MASK_REG ; TREG2 = Ch2 SD HW ACC3 output sample - CLR R30.t22 ; set SD snoop=0 - - ;NC sampling - ;One NC sample after every NC_PRD_CNT number of OC sample because NC OSR = NC_PRD_CNT * OC_OSR - ;read NC_PRD_CNT - LDI TREG3, 0 - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_SAMPLE_COUNT, 2 - SUB TREG3, TREG3, 1 - QBLE read_nc_frame, SAMP_CNT_REG, TREG3 - ADD SAMP_CNT_REG, SAMP_CNT_REG, 1 ; increment OC sample count - QBA skip_nc_frame -read_nc_frame: - - .if $isdefed("DEBUG_CODE") - ;Debug code :GPIO HIGH - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH0_SET_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_SET_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH0_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - ;debug code end - .endif - - ; restore differentiator state(R9-R17) - xchg BANK_CTXT_NC, &R9, 4*NUM_REGS_DIFF_STATE - - ; Execute SINC3 differentiation for Ch0 - MOV DN0, TREG0 ; DN0 = Ch1 SD HW ACC3 output sample - M_ACC3_PROCESS ACC3_DN1_CH0, ACC3_DN3_CH0, ACC3_DN5_CH0 - ; Save NC output sample to local output sample buffer - SBBO &CN5, OUT_SAMP_BUF_REG, 0, 4 - - - ; Execute SINC3 differentiation for Ch1 - MOV DN0, TREG1 ; DN0 = Ch1 SD HW ACC3 output sample - M_ACC3_PROCESS ACC3_DN1_CH1, ACC3_DN3_CH1, ACC3_DN5_CH1 - ; Save output sample to local output sample buffer - SBBO &CN5, OUT_SAMP_BUF_REG, 4, 4 - - ; Execute SINC3 differentiation for Ch2 - MOV DN0, TREG2 ; DN0 = Ch2 SD HW ACC3 output sample - M_ACC3_PROCESS ACC3_DN1_CH2, ACC3_DN3_CH2, ACC3_DN5_CH2 - ; Save output sample to local output sample buffer - SBBO &CN5, OUT_SAMP_BUF_REG, 8, 4 - - - .if $isdefed("DEBUG_CODE") - ;Debug code - ; Write local interleaved output samples to Host buffer address - LBBO &TREG3, OUT_SAMP_BUF_REG, 0, ICSSG_NUM_SD_CH_FW*4 - SBBO &TREG3, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_OUT_SAMP_BUF_OFFSET, ICSSG_NUM_SD_CH_FW*4 - ; Trigger interrupt - LDI R31.w0, TRIGGER_HOST_SDDF_IRQ - .endif - - - ;sample read - LBCO &TREG3, CT_PRU_ICSSG_LOC_DMEM, FW_REG_SDDF_CFG_TRIG_SAMPLE_TIME, FW_REG_SDDF_CFG_TRIG_SAMPLE_TIME_SZ - QBLE sample_time_before_sample, CURRENT_COMP4_REG_VALUE, TREG3 - SUB CURRENT_COMP4_REG_VALUE, TREG3, CURRENT_COMP4_REG_VALUE - LBCO &TREG3, CT_PRU_ICSSG_LOC_DMEM, FW_REG_SDDF_CFG_NC_PRD_IEP_CNT, FW_REG_SDDF_CFG_OC_PRD_IEP_CNT_SZ - ;LDI TREG3, 0x780 - LSR TREG3, TREG3, 1 - QBGE skip_sample_read, TREG3, CURRENT_COMP4_REG_VALUE - QBA trigger_intruppt -sample_time_before_sample: - SUB CURRENT_COMP4_REG_VALUE, CURRENT_COMP4_REG_VALUE, TREG3 - LBCO &TREG3, CT_PRU_ICSSG_LOC_DMEM, FW_REG_SDDF_CFG_NC_PRD_IEP_CNT, FW_REG_SDDF_CFG_OC_PRD_IEP_CNT_SZ - ;LDI TREG3, 0x780 - LSR TREG3, TREG3, 1 - QBLE skip_sample_read, CURRENT_COMP4_REG_VALUE, TREG3 - QBA trigger_intruppt -trigger_intruppt: - - .if $isdefed("DEBUG_CODE") - ;GPIO HIGH - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH2_SET_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_SET_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH2_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - .endif - ; Write local interleaved output samples to Host buffer address - LBBO &TREG3, OUT_SAMP_BUF_REG, 0, ICSSG_NUM_SD_CH_FW*4 - SBBO &TREG3, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_OUT_SAMP_BUF_OFFSET, ICSSG_NUM_SD_CH_FW*4 - ; Trigger interrupt - LDI R31.w0, TRIGGER_HOST_SDDF_IRQ - - .if $isdefed("DEBUG_CODE") - ;GPIO LOW - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH2_CLR_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH2_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - .endif - -skip_sample_read: - - - - ;restore/save contex - ;save differentiator state(R9-R17) - xchg BANK_CTXT_NC, &R9, 4*NUM_REGS_DIFF_STATE - - .if $isdefed("DEBUG_CODE") - ;GPIO LOW - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH0_CLR_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH0_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - .endif - - LDI SAMP_CNT_REG, 0 ; reset sample count -skip_nc_frame: - - ; Execute SINC3 differentiation for Ch0 - MOV DN0, TREG0 ; DN0 = Ch1 SD HW ACC3 output sample - MOV TREG0, TREG1 ;move Ch1 data into TREG0 - MOV TREG1, TREG2 ; Move ch2 data into TREG1 - M_ACC3_PROCESS ACC3_DN1_CH0, ACC3_DN3_CH0, ACC3_DN5_CH0 - - - ;Comparator for Ch0 - MOV TREG2, CN5 - - .if $isdefed("DEBUG_CODE") - SBBO &CN5, OUT_SAMP_BUF_REG, 0, 4 - .endif - - ;For the current channel, compare against the High threshold, Low threshold and ZC thresholds (if enabled) - ;Load the positive threshold value for current channel - LBBO &OC_HIGH_THR, SDDF_CFG_BASE_PTR_REG, FW_REG_SDFM_CFG_OC_HIGH_THR_CH0_OFFSET, FW_REG_SDFM_CFG_OC_HIGH_THR_SZ - ;Load the positive threshold value for current channel - LBBO &OC_LOW_THR, SDDF_CFG_BASE_PTR_REG, FW_REG_SDFM_CFG_OC_LOW_THR_CH0_OFFSET, FW_REG_SDFM_CFG_OC_LOW_THR_SZ - ;Load the zero crossing threshold value for current channel - LBBO &OC_ZC_THR, SDDF_CFG_BASE_PTR_REG, FW_REG_SDFM_CFG_OC_ZC_THR_CH0_OFFSET, FW_REG_SDFM_CFG_ZC_THR_SZ - - ;Check if the comparator is enabled for current channel - LBBO &COMPARATOR_EN, SDDF_CFG_BASE_PTR_REG, FW_REG_SDFM_CFG_SD_EN_COMP_OFFSET, FW_REG_SDFM_CFG_EN_COMP_SZ - QBBC comp_ch0_end, COMPARATOR_EN, SDFM_CFG_BF_SD_CH0_EN_COMP_BIT - ;Check if the sample value is greater than the high threshold - QBGE over_threshold_start_ch0, OC_HIGH_THR, TREG2 - ;Check if the sample value is lower than the high threshold - QBLE over_threshold_end_ch0, OC_HIGH_THR, TREG2 -low_threshold_ch0_check: - ;Check if the sample value is greater than the low threshold - QBGE below_threshold_end_ch0, OC_LOW_THR, TREG2 - ;Check if the sample value is lower than the low threshold - QBLE below_threshold_start_ch0, OC_LOW_THR, TREG2 -over_threshold_start_ch0: - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH0_SET_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_SET_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH0_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - QBA low_threshold_ch0_check - -over_threshold_end_ch0: - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH0_CLR_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH0_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - QBA low_threshold_ch0_check - -below_threshold_end_ch0: - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_LOW_THR_CH0_CLR_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_LOW_THR_CH0_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - QBA comp_ch0_end - -below_threshold_start_ch0: - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_LOW_THR_CH0_SET_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_LOW_THR_CH0_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - - -comp_ch0_end: - - - ; Execute SINC3 differentiation for Ch1 - MOV DN0, TREG0 ; DN0 = Ch1 SD HW ACC3 output sample - M_ACC3_PROCESS ACC3_DN1_CH1, ACC3_DN3_CH1, ACC3_DN5_CH1 - - - ;Comparator for ch1 - MOV TREG2, CN5 - - .if $isdefed("DEBUG_CODE") - SBBO &CN5, OUT_SAMP_BUF_REG, 4, 4 - .endif - - ;For the current channel, compare against the High threshold, Low threshold and ZC thresholds (if enabled) - ;Load the positive threshold value for current channel - LBBO &OC_HIGH_THR, SDDF_CFG_BASE_PTR_REG, FW_REG_SDFM_CFG_OC_HIGH_THR_CH1_OFFSET, FW_REG_SDFM_CFG_OC_HIGH_THR_SZ - ;Load the positive threshold value for current channel - LBBO &OC_LOW_THR, SDDF_CFG_BASE_PTR_REG, FW_REG_SDFM_CFG_OC_LOW_THR_CH1_OFFSET, FW_REG_SDFM_CFG_OC_LOW_THR_SZ - ;Load the zero crossing threshold value for current channel - LBBO &OC_ZC_THR, SDDF_CFG_BASE_PTR_REG, FW_REG_SDFM_CFG_OC_ZC_THR_CH1_OFFSET, FW_REG_SDFM_CFG_ZC_THR_SZ - - ;Check if the comparator is enabled for current channel - LBBO &COMPARATOR_EN, SDDF_CFG_BASE_PTR_REG, FW_REG_SDFM_CFG_SD_EN_COMP_OFFSET, FW_REG_SDFM_CFG_EN_COMP_SZ - QBBC comp_ch1_end, COMPARATOR_EN, SDFM_CFG_BF_SD_CH1_EN_COMP_BIT - ;Check if the sample value is greater than the high threshold - QBGE over_threshold_start_ch1, OC_HIGH_THR, TREG2 - ;Check if the sample value is lower than the high threshold - QBLE over_threshold_end_ch1, OC_HIGH_THR, TREG2 -low_threshold_ch1_check: - ;Check if the sample value is greater than the low threshold - QBGE below_threshold_end_ch1, OC_LOW_THR, TREG2 - ;Check if the sample value is lower than the low threshold - QBLE below_threshold_start_ch1, OC_LOW_THR, TREG2 -over_threshold_start_ch1: - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH1_SET_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_SET_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH1_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - QBA low_threshold_ch1_check - -over_threshold_end_ch1: - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH1_CLR_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH1_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - QBA low_threshold_ch1_check - -below_threshold_end_ch1: - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_LOW_THR_CH1_CLR_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_LOW_THR_CH1_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - QBA comp_ch1_end - -below_threshold_start_ch1: - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_LOW_THR_CH1_SET_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_SET_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_LOW_THR_CH1_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - -comp_ch1_end: - - ; Execute SINC3 differentiation for Ch2 - MOV DN0, TREG1 ; DN0 = Ch2 SD HW ACC3 output sample - M_ACC3_PROCESS ACC3_DN1_CH2, ACC3_DN3_CH2, ACC3_DN5_CH2 - - - ;Comparator for ch2 - MOV TREG2, CN5 - - .if $isdefed("DEBUG_CODE") - SBBO &CN5, OUT_SAMP_BUF_REG, 8, 4 - .endif - - ;For the current channel, compare against the High threshold, Low threshold and ZC thresholds (if enabled) - ;Load the positive threshold value for current channel - LBBO &OC_HIGH_THR, SDDF_CFG_BASE_PTR_REG, FW_REG_SDFM_CFG_OC_HIGH_THR_CH2_OFFSET, FW_REG_SDFM_CFG_OC_HIGH_THR_SZ - ;Load the positive threshold value for current channel - LBBO &OC_LOW_THR, SDDF_CFG_BASE_PTR_REG, FW_REG_SDFM_CFG_OC_LOW_THR_CH2_OFFSET, FW_REG_SDFM_CFG_OC_LOW_THR_SZ - ;Load the zero crossing threshold value for current channel - LBBO &OC_ZC_THR, SDDF_CFG_BASE_PTR_REG, FW_REG_SDFM_CFG_OC_ZC_THR_CH2_OFFSET, FW_REG_SDFM_CFG_ZC_THR_SZ - - ;Check if the comparator is enabled for current channel - LBBO &COMPARATOR_EN, SDDF_CFG_BASE_PTR_REG, FW_REG_SDFM_CFG_SD_EN_COMP_OFFSET, FW_REG_SDFM_CFG_EN_COMP_SZ - QBBC comp_ch2_end, COMPARATOR_EN, SDFM_CFG_BF_SD_CH2_EN_COMP_BIT - ;Check if the sample value is greater than the high threshold - QBGE over_threshold_start_ch2, OC_HIGH_THR, TREG2 - ;Check if the sample value is lower than the high threshold - QBLE over_threshold_end_ch2, OC_HIGH_THR, TREG2 - ;Check if the sample value is greater than the low threshold -low_threshold_ch2_check: - QBGE below_threshold_end_ch2, OC_LOW_THR, TREG2 - ;Check if the sample value is lower than the low threshold - QBLE below_threshold_start_ch2, OC_LOW_THR, TREG2 -over_threshold_start_ch2: - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH2_SET_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_SET_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH2_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - QBA low_threshold_ch2_check - -over_threshold_end_ch2: - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH2_CLR_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH2_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - QBA low_threshold_ch2_check - -below_threshold_end_ch2: - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_LOW_THR_CH2_CLR_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_LOW_THR_CH2_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - QBA comp_ch2_end - -below_threshold_start_ch2: - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_LOW_THR_CH2_SET_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_LOW_THR_CH2_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ -comp_ch2_end: - - .if $isdefed("DEBUG_CODE") - ;Debug code - ; Write local interleaved output samples to Host buffer address - LBBO &TREG3, OUT_SAMP_BUF_REG, 0, ICSSG_NUM_SD_CH_FW*4 - SBBO &TREG3, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_OUT_SAMP_BUF_OFFSET, ICSSG_NUM_SD_CH_FW*4 - ; Trigger interrupt - LDI R31.w0, TRIGGER_HOST_SDDF_IRQ - .endif - - - - .if $isdefed("DEBUG_CODE") - ;GPIO LOW - LBBO &GPIO_TGL_ADDR, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH1_CLR_VAL_ADDR_OFFSET, FW_REG_SDFM_CFG_GPIO_CLR_ADDR_SZ - LBBO &TREG3, SDDF_CFG_BASE_PTR_REG, SDFM_CFG_HIGH_THR_CH1_WRITE_VAL_OFFSET, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - SBBO &TREG3, GPIO_TGL_ADDR, 0, FW_REG_SDFM_CFG_GPIO_VALUE_SZ - .endif - - - ; Save/restore context - ; save differentiator state(R9-R17) - xchg BANK_CTXT_OC, &R9, 4*NUM_REGS_DIFF_STATE - - - - XIN TM_YIELD_XID, &R0.b3,1 ; exit task after two instructions/cycles - NOP - NOP - -; -; Initialize Task Manager -; -tm_init: -; Configure Task Manager tasks -; - ; TM general purpose mode - ; Enable T1_S1: IEP0 CMP4 task - LDI TREG0.b0, (1b<<3|0b<<2|11b<<0) ; enable T1_s1 - SBCO &TREG0.b0, CT_PRU_ICSSG_TM, 0, 1 - - ;set T1_S1 address - LDI TREG0.w0, $CODE(ts1_oc_loop) - SBCO &TREG0.w0, CT_PRU_ICSSG_TM, TASKS_MGR_TS1_PC_S1, 2 - - ; Set Task triggers - ; set T1_S1 trigger to IEP0 CMP4 event = 20 - LDI TREG0.w0, (COMP4_EVENT_NUMBER< CMP4 enabled - SBCO &TREG0.b0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_CMP_CFG_REG, 1 ; TR0 -> ICSSG_CMP_CFG_REG Byte0 - - - - JMP RET_ADDR_REG - - -; -; Reset SDDF state -; -; Arguments: None -; -reset_sddf_state: - ZERO &R9, (4*NUM_REGS_DIFF_STATE) - XOUT BANK_CTXT_OC, &R9, (4*NUM_REGS_DIFF_STATE);clear OC differentiator state - - XOUT BANK_CTXT_NC, &R9, (4*NUM_REGS_DIFF_STATE) ;clear NC differentiator state - JMP RET_ADDR_REG - - -; -; Configure OC Over Sampling Rate for SD channels -; -; Arguments: -; SDDF_CFG_BASE_PTR_REG: base address of SD Configuration registers (&IEP_CFG_EPWM_PRD) -; SD_HW_BASE_PTR_REG: base address of SD HW configuration registers (&ICSSG_PRUn_SD_CLK_SEL_REG0) -; -config_oc_osr: - - ; Load TR1.w0 <- SDDF_CFG_SD_CH_ID = ;LDI TREG1.w0, 0x210 =001100010000 - - LBBO &TREG1.w0, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_SD_CH_ID_OFFSET, FW_REG_SDDF_CFG_SD_CH_ID_SZ - - LOOP config_osr_loop_end, ICSSG_NUM_SD_CH_FW ; loop over SD channels - AND TREG2.b0, TREG1.b0, BF_SD_CH0_ID_MASK ; LS byte is ID for Ch0 - QBNE SDFM_SKIP0_CH0, TREG2.b0, 0 - ; Load TR0.b0 <- FW_REG_SDDF_CFG_OSR load osr from DMEM for ch0 - LBBO &TREG0.b0, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_CH0_OSR_OFFSET, FW_REG_SDDF_CFG_OSR_SZ - JMP SDFM_SKIP0_CH2 -SDFM_SKIP0_CH0: - QBNE SDFM_SKIP0_CH1, TREG2.b0, 1 - ; Load TR0.b0 <- FW_REG_SDDF_CFG_OSR load osr from DMEM for ch1 - LBBO &TREG0.b0, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_CH1_OSR_OFFSET, FW_REG_SDDF_CFG_OSR_SZ - JMP SDFM_SKIP0_CH2 -SDFM_SKIP0_CH1: - QBNE SDFM_SKIP0_CH2, TREG2.b0, 2 - ; Load TR0.b0 <- FW_REG_SDDF_CFG_OSR load osr from DMEM for ch2 - LBBO &TREG0.b0, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_CH2_OSR_OFFSET, FW_REG_SDDF_CFG_OSR_SZ -SDFM_SKIP0_CH2: - - LSL TREG2, TREG2, 3 ; (ChID*8) bytes to Byte0 PRUn_SD_SAMPLE_SIZE_REG(ChID) - ADD TREG2, TREG2, 4 ; 4 bytes added for Byte0 PRUn_SD_SAMPLE_SIZE_REG0 - - SBBO &TREG0.b0, SD_HW_BASE_PTR_REG, TREG2, 1 ; TR0.b0 -> PRUn_SD_SAMPLE_SIZE_REG(ChID) - LSR TREG1, TREG1, 4 ; LS byte is ID for Ch(i+1) ; FL fix me -config_osr_loop_end: - - JMP RET_ADDR_REG - - -; -; Configure SD channels. For SD channels, initialize: -; ACC select = ACC3 -; Clock inversion -; Clock source: pr1_pru_pru_r31_in[16] Primary Input -; -; SDDF_CFG_BASE_PTR_REG: base address of SD Configuration registers (&IEP_CFG_EPWM_PRD) -; SD_HW_BASE_PTR_REG: base address of SD HW configuration registers (&ICSSG_PRUn_SD_CLK_SEL_REG0) -; -config_sd_ch: - ; Load TR1.w0 <- SDDF_CFG_SD_CH_ID ;LDI TREG1.w0, 0x210 =001100010000 - - LBBO &TREG1.w0, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_SD_CH_ID_OFFSET, FW_REG_SDDF_CFG_SD_CH_ID_SZ - - LOOP config_sd_ch_loop_end, ICSSG_NUM_SD_CH_FW ; loop over SD channels - AND TREG2.b0, TREG1.b0, BF_SD_CH0_ID_MASK ; LS byte is ID for Chi - QBNE SDFM_SKIP1_CH0, TREG2.b0, 0 - ; Select clock inversion - LDI TREG0.w0, 0; - LBBO &TREG0.w2, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_CH0_CLOCK_INVERSION_OFFSET, 1 - LSL TREG0.b2, TREG0.b2, PRUn_SD_CLK_INVi_SHIFT - AND TREG0.b0, TREG0.b2, PRUn_SD_CLK_INVi_MASK< PRUn_SD_CLK_SEL_REGi - LSR TREG1, TREG1, 4 ; LS byte is ID for Ch(i+1) ; FL fix me -config_sd_ch_loop_end: - - JMP RET_ADDR_REG - - -; -; Reset SD channel hardware -; -; SDDF_CFG_BASE_PTR_REG: base address of SD Configuration registers (&IEP_CFG_EPWM_PRD) -; -reset_sd_ch_hw: - ; Load T01.w0 <- SDDF_CFG_SD_CH_ID - ;LDI TREG0.w0, 0x210 - LBBO &TREG0.w0, SDDF_CFG_BASE_PTR_REG, FW_REG_SDDF_CFG_SD_CH_ID_OFFSET, FW_REG_SDDF_CFG_SD_CH_ID_SZ - - LOOP reset_sd_ch_hw_loop_end, ICSSG_NUM_SD_CH_FW ; loop over SD channels - AND TREG1.b0, TREG0.b0, BF_SD_CH0_ID_MASK ; LS byte is ID for Chi - - ; Set R30[29-26]:channel_select = channel ID. - ; Set R30[25]:channel_en=1 (set Global Channel enable). - LSL TREG1.b0, TREG1.b0, 2 ; TR1.b0 = TR1.b0<<2 = (Ch ID)<<2 - SET TREG1.b0.t1 ; R30[25] channel_enable=1 - MOV R30.b3, TREG1.b0 ; R30.b3 = TR1.b0 - ; select SD Channel (Ch ID) - LSR TREG0, TREG0, 4 ; LS byte is ID for Ch(i+1) ; FL fix me - SET R31.t23 ; R31[23] re_init=1 -reset_sd_ch_hw_loop_end: - - JMP RET_ADDR_REG - - -; -; Initialize SD (eCAP PWM) clock -; -; Arguments: -; SDDF_CFG_BASE_PTR_REG: base address of SD Configuration registers (&IEP_CFG_EPWM_PRD) -; -init_sd_clock: - ; Set eCAP PWM mode - LDI32 TREG0, (SYNCI_EN_VAL<_r31_vec_valid to system event number, + 1<<5 + .if $isdefed("SDFM_PRU_CORE") +TRIGGER_HOST_SDFM_IRQ .set PRU_TRIGGER_HOST_SDFM_EVT + 16 + .elseif $isdefed("SDFM_RTU_CORE") +TRIGGER_HOST_SDFM_IRQ .set RTU_TRIGGER_HOST_SDFM_EVT + 16 + .endif + +;SPAD Bank for SD Ch context storage +BANK_CTXT_NC .set BANK0 + +;differentiator state located in BANK locations 9-17 +NUM_REGS_DIFF_STATE .set 9 ; Number of PRU registers for differentiator state +OUT_SAMP_MASK .set 0x0FFFFFFF ; 28-bit mask applied to Integrator & Differentiator output + +;Required sample for stable NC sample = NC_SAMP_CNT - 1 +NC_SAMP_CNT .set 4 + +;--------------------------------------Unsed Registers-------------------------------------; +;registers R20 - R24 +;R20: contain address of NC local output +;R21; output mask +;R22.w0 channel ID +;R24 PRUx CFG base address +;-------------------------------------------------------------------------------------------; + + + + ; local interleaved NC output sample buffer +OUT_SAMP_BUF: .usect ".outSamps", ICSSG_NUM_SD_CH_FW*4, 4 + .retain ".outSamps" + .retainrefs ".outSamps" + + .def SDFM_ENTRY ; global entry point + .ref dbg_setup_pinmux + + .sect ".text" + .retain ".text" + .retainrefs ".text" +SDFM_ENTRY: + ; Clear registers R0-R30 + ZERO &R0, 124 + + ; Disable Task Manager + ;.word 0x32000000 + M_PRU_TM_DISABLE + + ; Clear Task Manager status which is sticky after debug halt + LDI TEMP_REG0.w0, 0x0fff + SBCO &TEMP_REG0.w0, CT_PRU_ICSSG_TM, 0, 2 + XIN TM_YIELD_XID, &R0.b3,1 + LDI TEMP_REG0.w0, 0 + SBCO &TEMP_REG0.w0, CT_PRU_ICSSG_TM, 0, 2 + + + ; Write C24 block index for access to FW registers + WRITE_C24_BLK_INDEX C24_BLK_INDEX_FW_REGS_VAL + + +; +; Check SDFM global enable & set SDFM global enable acknowledge to inform R5 core. +; If SDFM global enable not set, wait for SDFM global enable from R5. +; +check_sdfm_en: + ; Check SDFM global enable + LBCO &TEMP_REG0.b0, CT_PRU_ICSSG_LOC_DMEM, SDFM_EN_OFFSET, SDFM_EN_SZ + QBBC check_sdfm_en, TEMP_REG0.b0, 0 ; If SDFM_EN not set, wait to set sdfm enable + + ; Set SDFM global enable acknowledge + SET TEMP_REG0, TEMP_REG0, 0 ; Set SDFM_EN_ACK + SBCO &TEMP_REG0.b0, CT_PRU_ICSSG_LOC_DMEM, SDFM_EN_ACK_OFFSET, SDFM_EN_ACK_SZ + + +; +; Perform initialization +; +init_sdfm: + ; Enable XIN/XOUT shifting. + ; Used for context & SD state save/restore in TM tasks. + LBCO &TEMP_REG0.b0, CT_PRU_ICSSG_CFG, ICSSG_CFG_SPPC, 1 + .if $isdefed("SDFM_PRU_CORE") + SET TEMP_REG0, TEMP_REG0, XFR_SHIFT_EN_BN ; ICSSG_SPP_REG:XFR_SHIFT_EN=1 + .elseif $isdefed("SDFM_RTU_CORE") + SET TEMP_REG0, TEMP_REG0, RTU_XFR_SHIFT_EN ; ICSSG_SPP_REG:RTU_XFR_SHIFT_EN=1 + .endif + SBCO &TEMP_REG0.b0, CT_PRU_ICSSG_CFG, ICSSG_CFG_SPPC, 1 + + ; Initialize Task Manager + JAL RET_ADDR_REG, tm_init + + ; Enable Task Manager + ;.word 0x32800000 + M_PRU_TM_ENABLE + + .if $isdefed("SDFM_PRU_CORE") ; no IEP on RTU + ; Initialize IEP0 + JAL RET_ADDR_REG, iep0_init + .endif + + + ; Initialize SD mode + LDI32 TEMP_REG1, PR1_PRUn_GP_MUX_SEL_VAL<_pru_r31_in[16] Primary Input + JAL RET_ADDR_REG, config_sd_ch + + ; Global enable SD HW, + ; reset SD channel HW + JAL RET_ADDR_REG, reset_sd_ch_hw + SET R30.t25 ; R30[25] channel_en = 1, all channels enabled + + ;Configure pwm TZ block + .if $isdefed("FD_CODE") + JAL RET_ADDR_REG, config_pwm_trip + .endif + + ; Initialize dedicated registers: + ; MASK register, + ; Local NC output sample buffer address, + ; Clear NC sample count. + LDI32 MASK_REG, OUT_SAMP_MASK + LDI32 OUT_SAMP_BUF_REG, OUT_SAMP_BUF + LDI SAMP_CNT_REG, 0 + LBCO &EN_DOUBLE_UPDATE, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_EN_DOUBLE_UPDATE, 1 + LDI SAMP_NAME, 0 + + + + + .if $isdefed("SDFM_PRU_CORE") ; no IEP on RTU + ; Start IEP + LBCO &TEMP_REG0.b0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_GLOBAL_CFG_REG, 1 + SET TEMP_REG0, TEMP_REG0, CNT_ENABLE_BN ; ICSSG_IEP_GLOBAL_CFG_REG:CNT_ENABLE=1 + SBCO &TEMP_REG0.b0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_GLOBAL_CFG_REG, 1 + .endif + + LBCO &COMPARATOR_EN, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_SD_EN_COMP_OFFSET, SDFM_CFG_EN_COMP_SZ + + QBBS ts0_oc_loop, COMPARATOR_EN, SDFM_CFG_EN_COMP_BIT + ;waiting loop if OC is disable +wait_loop: + JMP wait_loop + + +;------------------------------------Over Current---------------------------------------------------------; +;1) Select channel & read data from shadow register +;2) Does SINC3 differentiation +;3) Check sampled data value with High & Low threshold +;4) Toggle GPIO based on comparison +;---------------------------------------------------------------------------------------------------------; +ts0_oc_loop: + + QBBC comp_ch0_end, COMPARATOR_EN, SDFM_CFG_BF_SD_CH0_EN_COMP_BIT + ;Switch to SD HW to Ch0 & Enable channels + MOV TEMP_REG1.b0, SD_CH0_ID ;Select channel 0 + LSL TEMP_REG1.b0, TEMP_REG1.b0, 2 ;R30[26-29] channel select bits + SET TEMP_REG1.b0.t1 ;R30[25] global channel enable bit + MOV R30.b3, TEMP_REG1.b0 + NOP + + ; R31[28], check shadow_update_flag for Ch0 + QBBC comp_ch0_end, R31, 28 + + .if $isdefed("DEBUG_CODE") + ;Debug code :GPIO HIGH + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH0_SET_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_SET_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH0_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + .endif + + + ;R31[24], ; clear shadow update flag for ch0 + SET R31, R31.t24 + ; Load reg R31[0-27] SD HW ACC3 output sample + AND DN0, R31, MASK_REG + ;Execute Sinc3 Differentiation + M_ACC3_PROCESS ACC3_DN1_CH0, ACC3_DN3_CH0, ACC3_DN5_CH0 + + + .if $isdefed("DEBUG_CODE") + ;store data + SBBO &CN5, OUT_SAMP_BUF_REG, 0, 4 + .endif + + + + ;Comparator for Ch0 + MOV TEMP_REG2, CN5 + ;For the current channel, compare against the High threshold, Low threshold and ZC thresholds (if enabled) + ;Load the positive threshold value for current channel + LBCO &OC_HIGH_THR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_OC_HIGH_THR_CH0_OFFSET, SDFM_CFG_OC_HIGH_THR_SZ + ;Load the positive threshold value for current channel + LBCO &OC_LOW_THR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_OC_LOW_THR_CH0_OFFSET, SDFM_CFG_OC_LOW_THR_SZ + + QBGE over_threshold_start_ch0, OC_HIGH_THR, TEMP_REG2 + ;Check if the sample value is lower than the high threshold + QBLE over_threshold_end_ch0, OC_HIGH_THR, TEMP_REG2 +low_threshold_ch0_check: + ;Check if the sample value is greater than the low threshold + QBGE below_threshold_end_ch0, OC_LOW_THR, TEMP_REG2 + ;Check if the sample value is lower than the low threshold + QBLE below_threshold_start_ch0, OC_LOW_THR, TEMP_REG2 +over_threshold_start_ch0: + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH0_SET_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_SET_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH0_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + QBA low_threshold_ch0_check + +over_threshold_end_ch0: + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH0_CLR_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_CLR_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH0_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + QBA low_threshold_ch0_check + +below_threshold_end_ch0: + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH0_CLR_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_CLR_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH0_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + QBA comp_ch0_end + +below_threshold_start_ch0: + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH0_SET_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_CLR_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH0_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ +comp_ch0_end: + + + .if $isdefed("DEBUG_CODE") + ;GPIO LOW + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH0_CLR_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_CLR_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH0_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + .endif + + + + + QBBC comp_ch1_end, COMPARATOR_EN, SDFM_CFG_BF_SD_CH1_EN_COMP_BIT + ; Switch to SD HW to Ch1 & Enable channels + MOV TEMP_REG1.b0, SD_CH1_ID ;Select channel 1 + LSL TEMP_REG1.b0, TEMP_REG1.b0, 2 ;R30[26-29] channel select bits + SET TEMP_REG1.b0.t1 ;R30[25] global channel enable bit + MOV R30.b3, TEMP_REG1.b0 + NOP + + ; R31[28], check shadow_update_flag for ch1 + QBBC comp_ch1_end, R31, 28 + + + .if $isdefed("DEBUG_CODE") + ;GPIO HIGH + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH1_SET_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_SET_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH1_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + .endif + + + ; R31[24], shadow_update_flag_clr for ch1 + SET R31, R31.t24 + ; Load reg R31[0-27] SD HW ACC3 output sample + AND DN0, R31, MASK_REG + ;Execute Sinc3 Differentiation + M_ACC3_PROCESS ACC3_DN1_CH1, ACC3_DN3_CH1, ACC3_DN5_CH1 + + + .if $isdefed("DEBUG_CODE") + ;store data + SBBO &CN5, OUT_SAMP_BUF_REG, 4, 4 + .endif + + + + ;Comparator for Ch0 + MOV TEMP_REG2, CN5 + + ;For the current channel, compare against the High threshold, Low threshold and ZC thresholds (if enabled) + ;Load the positive threshold value for current channel + LBCO &OC_HIGH_THR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_OC_HIGH_THR_CH1_OFFSET, SDFM_CFG_OC_HIGH_THR_SZ + ;Load the positive threshold value for current channel + LBCO &OC_LOW_THR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_OC_LOW_THR_CH1_OFFSET, SDFM_CFG_OC_LOW_THR_SZ + + ;Check if the sample value is greater than the high threshold + QBGE over_threshold_start_ch1, OC_HIGH_THR, TEMP_REG2 + ;Check if the sample value is lower than the high threshold + QBLE over_threshold_end_ch1, OC_HIGH_THR, TEMP_REG2 +low_threshold_ch1_check: + ;Check if the sample value is greater than the low threshold + QBGE below_threshold_end_ch1, OC_LOW_THR, TEMP_REG2 + ;Check if the sample value is lower than the low threshold + QBLE below_threshold_start_ch1, OC_LOW_THR, TEMP_REG2 +over_threshold_start_ch1: + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH1_SET_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_SET_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH1_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + QBA low_threshold_ch1_check + +over_threshold_end_ch1: + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH1_CLR_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_CLR_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH1_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + QBA low_threshold_ch1_check + +below_threshold_end_ch1: + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH1_CLR_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_CLR_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH1_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + QBA comp_ch1_end + +below_threshold_start_ch1: + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH1_SET_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_SET_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH1_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ +comp_ch1_end: + + .if $isdefed("DEBUG_CODE") + ;GPIO LOW + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH1_CLR_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_CLR_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH1_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + .endif + + + + + QBBC comp_ch2_end, COMPARATOR_EN, SDFM_CFG_BF_SD_CH2_EN_COMP_BIT + ; Switch to SD HW to Ch2 & Enable Channels + MOV TEMP_REG1.w0, SD_CH2_ID ;Select channel 2 + LSL TEMP_REG1.b0, TEMP_REG1.b0, 2 ;R30[26-29] channel select bits + SET TEMP_REG1.b0.t1 ;R30[25] global channel enable bit + MOV R30.b3, TEMP_REG1.b0 + NOP + + ; R31[28], check shadow_update_flag for Ch2 + QBBC ts0_oc_loop, R31, 28 + + + .if $isdefed("DEBUG_CODE") + ; GPIO HIGH + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH2_SET_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_SET_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH2_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + .endif + + + ; R31[24], shadow_update_flag_clr for Ch2 + SET R31, R31.t24 + ; Load reg R31[0-27] SD HW ACC3 output sample + AND DN0, R31, MASK_REG + ; Execute Sinc3 Differentiation + M_ACC3_PROCESS ACC3_DN1_CH2, ACC3_DN3_CH2, ACC3_DN5_CH2 + + + .if $isdefed("DEBUG_CODE") + ;store data + SBBO &CN5, OUT_SAMP_BUF_REG, 8, 4 + .endif + + + ;Comparator for Ch2 + MOV TEMP_REG2, CN5 + + ;For the current channel, compare against the High threshold, Low threshold and ZC thresholds (if enabled) + ;Load the positive threshold value for current channel + LBCO &OC_HIGH_THR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_OC_HIGH_THR_CH2_OFFSET, SDFM_CFG_OC_HIGH_THR_SZ + ;Load the positive threshold value for current channel + LBCO &OC_LOW_THR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_OC_LOW_THR_CH2_OFFSET, SDFM_CFG_OC_LOW_THR_SZ + + ;Check if the sample value is greater than the high threshold + QBGE over_threshold_start_ch2, OC_HIGH_THR, TEMP_REG2 + ;Check if the sample value is lower than the high threshold + QBLE over_threshold_end_ch2, OC_HIGH_THR, TEMP_REG2 + ;Check if the sample value is greater than the low threshold +low_threshold_ch2_check: + QBGE below_threshold_end_ch2, OC_LOW_THR, TEMP_REG2 + ;Check if the sample value is lower than the low threshold + QBLE below_threshold_start_ch2, OC_LOW_THR, TEMP_REG2 +over_threshold_start_ch2: + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH2_SET_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_SET_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH2_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + QBA low_threshold_ch2_check + +over_threshold_end_ch2: + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH2_CLR_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_CLR_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH2_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + QBA low_threshold_ch2_check + +below_threshold_end_ch2: + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH2_CLR_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_CLR_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH2_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + QBA comp_ch2_end + +below_threshold_start_ch2: + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH2_SET_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_CLR_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH2_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_CLR_ADDR_SZ + +comp_ch2_end: + + + + .if $isdefed("DEBUG_CODE") + ; GPIO LOW + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH2_CLR_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_CLR_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_HIGH_THR_CH2_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + .endif + + .if $isdefed("DEBUG_CODE") + ; Write local interleaved output samples to Host buffer address + LBBO &TEMP_REG3, OUT_SAMP_BUF_REG, 0, ICSSG_NUM_SD_CH_FW*4 + SBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_OUT_SAMP_BUF_OFFSET, ICSSG_NUM_SD_CH_FW*4 + ; Trigger interrupt + LDI R31.w0, TRIGGER_HOST_SDFM_IRQ + .endif + + QBA ts0_oc_loop + + +;--------------------------------Normal Current---------------------------------------------------; +;Normal current +;1)Retore & save registers +;2)Clear CMP event +;3)Select channel, enable snoop mode, read data & does diffrentiation +;4) Update cmp register for next NC sample +; a)Check sample count: 4 times continuous NC sampling for stable data +; a)Update Cmp_reg based on first sample point, second sample point & sample count +;5)at every 4th sample of NC, firmware stores sampled in DMEM & triggers R5 interrupt +;6)restore & save registers +;7)clear task +;--------------------------------------------------------------------------------------------------; +ts1_nc_loop: + ; Save/restore context + ; restore differentiator state(R1-R18) for NC + ; save current registers values for OC + LDI R0.b0, 0 + MOV R18.b0, R30.b3 ; save T0 SD channel select + xchg BANK_CTXT_NC, &R1, 4*18 + + ; Clear IEP0 CMP4 event + LDI TEMP_REG0.b0, 0x10 + SBCO &TEMP_REG0.b0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_CMP_STATUS_REG, 1 + + .if $isdefed("DEBUG_CODE") + ;Debug code :GPIO HIGH + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH0_SET_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_SET_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH0_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + ;debug code end + .endif + + ;select ch0, enable all channel, set SD snoop=1 & sample_counter_select=1 + LDI R30.w2, (0<<10 | 1<<9 | 1<<6 | 1<<5) + NOP + ; Snoop read Ch0 sample_counter, + ; wait for ChX sample count+1. + AND TEMP_REG1, R31, 0xFF ; snoop read LSB Ch0 sample_counter +wait_sample_count_incr_oc: + AND TEMP_REG2, R31, 0xFF ; snoop read LSB Ch0 sample_counter + QBEQ wait_sample_count_incr_oc, TEMP_REG2, TEMP_REG1 + + .if $isdefed("DEBUG_CODE") + ;GPIO LOW + LBCO &GPIO_TGL_ADDR, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH0_CLR_VAL_ADDR_OFFSET, SDFM_CFG_GPIO_CLR_ADDR_SZ + LBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_LOW_THR_CH0_WRITE_VAL_OFFSET, SDFM_CFG_GPIO_VALUE_SZ + SBBO &TEMP_REG3, GPIO_TGL_ADDR, 0, SDFM_CFG_GPIO_VALUE_SZ + + ;Store sample counter values + LDI TEMP_REG1, SDFM_DUBUG_OFFSET + LSL TEMP_REG3, SAMP_CNT_REG, 1 + ADD TEMP_REG1, TEMP_REG3, TEMP_REG1 + SBCO &TEMP_REG2, CT_PRU_ICSSG_LOC_DMEM, TEMP_REG1, 1 + .endif + + ;Snoop read Ch0 ACC3 + CLR R30.t21 ; set SD sample_counter_select=0 + NOP + AND DN0, R31, MASK_REG ; DN0 = Ch0 SD HW ACC3 output sample + CLR R30.t22 ; set SD snoop=0 + + ;select ch1, enable all channel & set SD snoop=1 + LDI R30.w2, (1<<10 | 1<<9 | 1<<6) + NOP + ; Snoop read ACC3 for SD Ch1 + AND TEMP_REG1, R31, MASK_REG ; TEMP_REG0 = Ch1 SD HW ACC3 output sample + CLR R30.t22 ; set SD snoop=0 + + + ;select ch2, enable all channel & set SD snoop=1 + LDI R30.w2, (2<<10 | 1<<9 | 1<<6) + NOP + ; Snoop read ACC3 for SD Ch2 + AND TEMP_REG2, R31, MASK_REG ; TEMP_REG1 = Ch2 SD HW ACC3 output sample + CLR R30.t22 ; set SD snoop=0 + + ; Execute SINC3 differentiation for Ch0 + M_ACC3_PROCESS ACC3_DN1_CH0, ACC3_DN3_CH0, ACC3_DN5_CH0 + ; Save NC output sample to local output sample buffer + SBBO &CN5, OUT_SAMP_BUF_REG, 0, 4 + + ; Execute SINC3 differentiation for Ch1 + MOV DN0, TEMP_REG1 ; DN0 = Ch1 SD HW ACC3 output sample + M_ACC3_PROCESS ACC3_DN1_CH1, ACC3_DN3_CH1, ACC3_DN5_CH1 + ; Save output sample to local output sample buffer + SBBO &CN5, OUT_SAMP_BUF_REG, 4, 4 + + ; Execute SINC3 differentiation for Ch2 + MOV DN0, TEMP_REG2 ; DN0 = Ch2 SD HW ACC3 output sample + M_ACC3_PROCESS ACC3_DN1_CH2, ACC3_DN3_CH2, ACC3_DN5_CH2 + ; Save output sample to local output sample buffer + SBBO &CN5, OUT_SAMP_BUF_REG, 8, 4 + + ;Check NC sample count + QBLE RESET_NC_FRAME, SAMP_CNT_REG, NC_SAMP_CNT-1 + ; NC sample count < NC_SAMP_CNT-1 + ; Add configured IEP count for NC OSR + ; IEP0 CMP4_reg = cmp4_reg + NC_OSR*IEP_CLOCK* SD_cycle + LBCO &TEMP_REG0, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_NC_PRD_IEP_CNT_OFFSET, 4 + LBCO &TEMP_REG1, CT_PRU_ICSSG_IEP0, ICSSG_IEP_CMP4_REG0, 4 ; + ADD TEMP_REG0, TEMP_REG1, TEMP_REG0 + SBCO &TEMP_REG0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_CMP4_REG0, 4 + + ADD SAMP_CNT_REG, SAMP_CNT_REG, 1 ; increment NC sample count + + QBA NRESET_NC_FRAME + +RESET_NC_FRAME: + ; Set IEP CMP$ value: IEP_CMP4_REG1:REG0 = 0:TRIG_SAMPLE_TIME + QBBS FIRST_NC_SAMPLE, SAMP_NAME, 0 + QBBC FIRST_NC_SAMPLE, EN_DOUBLE_UPDATE, 0 ;check double update is enable + LBCO &TEMP_REG0, CT_PRU_ICSSG_LOC_DMEM, FW_REG_SDFM_CFG_SECOND_TRIG_SAMPLE_TIME, 4 + SUB TEMP_REG0, TEMP_REG0, IEP_DEFAULT_INC ; subtract IEP default increment since IEP counts 0...CMP4 + SBCO &TEMP_REG0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_CMP4_REG0, 4 + LDI SAMP_NAME, 1 ;clear sample name for first sample + QBA END_RESET_NC_FRAME +FIRST_NC_SAMPLE: + LBCO &TEMP_REG0, CT_PRU_ICSSG_LOC_DMEM, FW_REG_SDFM_CFG_FIRST_TRIG_SAMPLE_TIME, 4 + SUB TEMP_REG0, TEMP_REG0, IEP_DEFAULT_INC ; subtract IEP default increment since IEP counts 0...CMP4 + SBCO &TEMP_REG0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_CMP4_REG0, 4 + LDI SAMP_NAME, 0 ; update for Second sample +END_RESET_NC_FRAME: + LDI SAMP_CNT_REG, 0 ; reset NC sample count + ; Write local interleaved output samples to Host buffer address + LBBO &TEMP_REG3, OUT_SAMP_BUF_REG, 0, ICSSG_NUM_SD_CH_FW*4 + SBCO &TEMP_REG3, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_OUT_SAMP_BUF_OFFSET, ICSSG_NUM_SD_CH_FW*4 + ;Trigger interrupt + LDI R31.w0, TRIGGER_HOST_SDFM_IRQ + ;;SBCO &NC_OUTPUT_SAMP, CT_PRU_ICSSG_LOC_DMEM, SDFM_DUBUG_OFFSET, 4 + +NRESET_NC_FRAME: + + ; Save/restore context + ; save differentiator state(R9-R17) for NC + ; restore NC registers + LDI R0.b0, 0 + xchg BANK_CTXT_NC, &R1, 4*18 + MOV R30.b3, R18.b0 ; restore T0 SD channel select + + XIN TM_YIELD_XID, &R0.b3, 1 ; exit task after two instructions/cycles + NOP + NOP + + +; +; Initialize Task Manager +; +tm_init: +; Configure Task Manager tasks +; + ; TM general purpose mode + ; Enable T1_S1: IEP0 CMP4 task + LDI TEMP_REG0.b0, (1b<<3|0b<<2|11b<<0) ; enable T1_s1 + SBCO &TEMP_REG0.b0, CT_PRU_ICSSG_TM, 0, 1 + + ;set T1_S1 address + LDI TEMP_REG0.w0, $CODE(ts1_nc_loop) + SBCO &TEMP_REG0.w0, CT_PRU_ICSSG_TM, TASKS_MGR_TS1_PC_S1, 2 + + ; Set Task triggers + ; set T1_S1 trigger to IEP0 CMP4 event = 20 + LDI TEMP_REG0.w0, (COMP4_EVENT_NUMBER< CMP4 enabled + SBCO &TEMP_REG0.b0, CT_PRU_ICSSG_IEP0, ICSSG_IEP_CMP_CFG_REG, 1 ; TR0 -> ICSSG_CMP_CFG_REG Byte0 + + + + JMP RET_ADDR_REG + + +; +; Reset Scratchpad for NC registers +; +; Arguments: None +; +reset_sdfm_state: + LDI R0.b0, 0 + ZERO &R1, 4*18 + XOUT BANK_CTXT_NC, &R1, 4*18 ;clear ScratchPad registers for NC + JMP RET_ADDR_REG + + +; +; Configure OC OSR, FD_ONE Min/Max, for SD channels +; +; Arguments: +; CT_PRU_ICSSG_LOC_DMEM: base address of SD Configuration registers (&IEP_CFG_EPWM_PRD) +; SD_HW_BASE_PTR_REG: base address of SD HW configuration registers (&ICSSG_PRUn_SD_CLK_SEL_REG0) +; +config_oc_osr: + + LDI TEMP_REG0, 0 + ; Load TR1.w0 <- SDFM_CFG_SD_CH_ID = ;LDI TEMP_REG1.w0, 0x210 =001100010000 + LBCO &TEMP_REG1.w0, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_SD_CH_ID_OFFSET, SDFM_CFG_SD_CH_ID_SZ + + LOOP config_osr_loop_end, ICSSG_NUM_SD_CH_FW ; loop over SD channels + AND TEMP_REG2.b0, TEMP_REG1.b0, BF_SD_CH0_ID_MASK ; LS byte is ID for Ch0 + QBNE SDFM_SKIP0_CH0, TEMP_REG2.b0, SD_CH0_ID + ; Load TR0.b0 <- SDFM_CFG_OSR load osr from DMEM for ch0 + LBCO &TEMP_REG0.b0, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH0_OSR_OFFSET, SDFM_CFG_OSR_SZ + + .if $isdefed("FD_CODE") + ;configure fast detect one count and enable fast detect + LBCO &FAST_window_REG, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH0_FD_WD_REG_OFFSET, 1 + LBCO &FAST_ONE_min_REG, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH0_FD_ONE_MIN_REG_OFFSET, 1 + LBCO &FAST_ONE_max_REG, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH0_FD_ONE_MAX_REG_OFFSET, 1 + + MOV TEMP_REG0.b1, FAST_window_REG + LSL TEMP_REG0.b2, FAST_ONE_min_REG, 3 + OR TEMP_REG0.b1, TEMP_REG0.b2, TEMP_REG0.b1 + LSL TEMP_REG0.b2, FAST_ONE_max_REG, 1 + OR TEMP_REG0.b2, TEMP_REG0.b2, 0x41;clear max & min threshold hit + OR TEMP_REG0.b2, TEMP_REG0.b2, 0x80;enable fast detec + .endif + + JMP SDFM_SKIP0_CH2 +SDFM_SKIP0_CH0: + QBNE SDFM_SKIP0_CH1, TEMP_REG2.b0, SD_CH1_ID + ; Load TR0.b0 <- SDFM_CFG_OSR load osr from DMEM for ch1 + LBCO &TEMP_REG0.b0, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH1_OSR_OFFSET, SDFM_CFG_OSR_SZ + + .if $isdefed("FD_CODE") + ;configure fast detect one count and enable fast detect + LBCO &FAST_window_REG, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH1_FD_WD_REG_OFFSET, 1 + LBCO &FAST_ONE_min_REG, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH1_FD_ONE_MIN_REG_OFFSET, 1 + LBCO &FAST_ONE_max_REG, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH1_FD_ONE_MAX_REG_OFFSET, 1 + + MOV TEMP_REG0.b1, FAST_window_REG + LSL TEMP_REG0.b2, FAST_ONE_min_REG, 3 + OR TEMP_REG0.b1, TEMP_REG0.b2, TEMP_REG0.b1 + LSL TEMP_REG0.b2, FAST_ONE_max_REG, 1 + OR TEMP_REG0.b2, TEMP_REG0.b2, 0x41;clear max & min threshold hit + OR TEMP_REG0.b2, TEMP_REG0.b2, 0x80;enable fast detect + .endif + + JMP SDFM_SKIP0_CH2 +SDFM_SKIP0_CH1: + QBNE SDFM_SKIP0_CH2, TEMP_REG2.b0, SD_CH2_ID + ; Load TR0.b0 <- SDFM_CFG_OSR load osr from DMEM for ch2 + LBCO &TEMP_REG0.b0, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH2_OSR_OFFSET, SDFM_CFG_OSR_SZ + + .if $isdefed("FD_CODE") + ;configure fast detect one count and enable fast detect + LBCO &FAST_window_REG, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH2_FD_WD_REG_OFFSET, 1 + LBCO &FAST_ONE_min_REG, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH2_FD_ONE_MIN_REG_OFFSET, 1 + LBCO &FAST_ONE_max_REG, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH2_FD_ONE_MAX_REG_OFFSET, 1 + + MOV TEMP_REG0.b1, FAST_window_REG + LSL TEMP_REG0.b2, FAST_ONE_min_REG, 3 + OR TEMP_REG0.b1, TEMP_REG0.b2, TEMP_REG0.b1 + LSL TEMP_REG0.b2, FAST_ONE_max_REG, 1 + ;clear max & min threshold hit + OR TEMP_REG0.b2, TEMP_REG0.b2, 0x41 + ;fast detect is enabled at a later stage + OR TEMP_REG0.b2, TEMP_REG0.b2, 0x80 + .endif + +SDFM_SKIP0_CH2: + + LSL TEMP_REG2, TEMP_REG2, 3 ; (ChID*8) bytes to Byte0 PRUn_SD_SAMPLE_SIZE_REG(ChID) + ADD TEMP_REG2, TEMP_REG2, 4 ; 4 bytes added for Byte0 PRUn_SD_SAMPLE_SIZE_REG0 + + SBBO &TEMP_REG0, SD_HW_BASE_PTR_REG, TEMP_REG2, 3 ; TR0.b0 -> PRUn_SD_SAMPLE_SIZE_REG(ChID) + LSR TEMP_REG1, TEMP_REG1, 4 ; LS byte is ID for Ch(i+1) ; FL fix me +config_osr_loop_end: + + JMP RET_ADDR_REG + + +; +; Configure SD channels. For SD channels, initialize: +; ACC select = ACC3 +; Clock inversion +; Clock source: pr1_pru_pru_r31_in[16] Primary Input +; +; CT_PRU_ICSSG_LOC_DMEM: base address of SD Configuration registers (&IEP_CFG_EPWM_PRD) +; SD_HW_BASE_PTR_REG: base address of SD HW configuration registers (&ICSSG_PRUn_SD_CLK_SEL_REG0) +; +; +config_sd_ch: + LDI TEMP_REG0, 0 + ; Load TR1.w0 <- SDFM_CFG_SD_CH_ID ;LDI TEMP_REG1.w0, 0x210 =001100010000 + + LBCO &TEMP_REG1.w0, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_SD_CH_ID_OFFSET, SDFM_CFG_SD_CH_ID_SZ + + LOOP config_sd_ch_loop_end, ICSSG_NUM_SD_CH_FW ; loop over SD channels + AND TEMP_REG2.b0, TEMP_REG1.b0, BF_SD_CH0_ID_MASK ; LS byte is ID for Chi + QBNE SDFM_SKIP1_CH0, TEMP_REG2.b0, SD_CH0_ID + ; Select clock inversion + LDI TEMP_REG0.w0, 0; + LBCO &TEMP_REG0.w2, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_CH0_CLOCK_INVERSION_OFFSET, 1 + LSL TEMP_REG0.b2, TEMP_REG0.b2, PRUn_SD_CLK_INVi_SHIFT + AND TEMP_REG0.b0, TEMP_REG0.b2, PRUn_SD_CLK_INVi_MASK< PRUn_SD_CLK_SEL_REGi + LSR TEMP_REG1, TEMP_REG1, 4 ; LS byte is ID for Ch(i+1) ; FL fix me +config_sd_ch_loop_end: + + JMP RET_ADDR_REG + + + +; +; Reset SD channel hardware +; +; CT_PRU_ICSSG_LOC_DMEM: base address of SD Configuration registers (&IEP_CFG_EPWM_PRD) +; +reset_sd_ch_hw: + ; Load T01.w0 <- SDFM_CFG_SD_CH_ID + ;LDI TEMP_REG0.w0, 0x210 + LBCO &TEMP_REG0.w0, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_SD_CH_ID_OFFSET, SDFM_CFG_SD_CH_ID_SZ + + LOOP reset_sd_ch_hw_loop_end, ICSSG_NUM_SD_CH_FW ; loop over SD channels + AND TEMP_REG1.b0, TEMP_REG0.b0, BF_SD_CH0_ID_MASK ; LS byte is ID for Chi + + ; Set R30[29-26]:channel_select = channel ID. + ; Set R30[25]:channel_en=1 (set Global Channel enable). + LSL TEMP_REG1.b0, TEMP_REG1.b0, 2 ; TR1.b0 = TR1.b0<<2 = (Ch ID)<<2 + SET TEMP_REG1.b0.t1 ; R30[25] channel_enable=1 + MOV R30.b3, TEMP_REG1.b0 ; R30.b3 = TR1.b0 + ; select SD Channel (Ch ID) + LSR TEMP_REG0, TEMP_REG0, 4 ; LS byte is ID for Ch(i+1) ; FL fix me + SET R31.t23 ; R31[23] re_init=1 +reset_sd_ch_hw_loop_end: + + JMP RET_ADDR_REG + + + .if $isdefed("FD_CODE") +; +;EPWM trip generation configuration +config_pwm_trip: + ;set trip mask + LDI TEMP_REG1, 0x134 + LBCO &TEMP_REG0, CT_PRU_ICSSG_CFG, TEMP_REG1, 4 + LDI TEMP_REG0.b1, 0x02; trip mask + SBCO &TEMP_REG0, CT_PRU_ICSSG_CFG, TEMP_REG1, 4 + + JMP RET_ADDR_REG + .endif +; +; Initialize SD (eCAP PWM) clock +; +; Arguments: +; CT_PRU_ICSSG_LOC_DMEM: base address of SD Configuration registers (&IEP_CFG_EPWM_PRD) +; +init_sd_clock: + ; Set eCAP PWM mode + LDI32 TEMP_REG0, (SYNCI_EN_VAL< -#include "../firmware/icssg_sddf.h" +#include "../firmware/icssg_sdfm.h" #include /** @@ -124,16 +124,16 @@ void SDFM_setEnableChannel(sdfm_handle h_sdfm, uint8_t channel_number); /** * - * \brief Configure Accumulator over sampling ratio + * \brief Configure comparator filter (over current) sampling ratio * * \param[in] h_sdfm SDFM handle * \param[in] ch_id current ch number - * \param[in] osr over sampling ratio + * \param[in] osr comparator filter/Over current sampling ratio * * * */ -void SDFM_setAccOverSamplingRatio(sdfm_handle h_sdfm, uint8_t ch_id, uint8_t osr); +void SDFM_setCompFilterOverSamplingRatio(sdfm_handle h_sdfm, uint8_t ch_id, uint16_t osr); /** * @@ -161,15 +161,41 @@ void SDFM_setCompFilterThresholds(sdfm_handle h_sdfm, uint8_t ch_id, SDFM_Thresh /** * - * \brief configuration of sample read time one Epwm cycle + * \brief configuration of single sample trigger time one Epwm cycle * * \param[in] h_sdfm SDFM handle - * \param[in] trig_samp_time sample read time in one pwm cycle + * \param[in] samp_trig_time first sample trigger time in one pwm cycle * * * */ -void SDFM_setSampleReadingTime(sdfm_handle h_sdfm, float trig_samp_time); +void SDFM_setSampleTriggerTime(sdfm_handle h_sdfm, float samp_trig_time); + +/** + * + * + * \brief configuration and enable second normal current sample starting time one Epwm cycle + * + * \param[in] h_sdfm SDFM handle + * \param[in] samp_trig_time second sample trigger time in one PWM cycle + * + * + * +*/ +void SDFM_enableDoubleSampling(sdfm_handle h_sdfm, float samp_trig_time); + +/** + * + * + * \brief Disable double normal current update/sampling + * + * \param[in] h_sdfm SDFM handle + * + * + * +*/ +void SDFM_disableDoubleSampling(sdfm_handle h_sdfm); + /** * @@ -250,19 +276,6 @@ void SDFM_configComparatorGpioPins(sdfm_handle h_sdfm, uint8_t ch,uint32_t gpio_ * */ uint32_t SDFM_getFilterData(uint8_t ch); - -/** - * - * \brief Configure iep count for over current sampling - * - * \param[in] h_sdfm SDFM handle - * \param[in] osr over current osr value - * - * - * - */ -void SDFM_setCompFilterOverSamplingRatio(sdfm_handle h_sdfm, uint16_t osr); - /** * * \brief Configure iep count for normal current sampling @@ -273,7 +286,8 @@ void SDFM_setCompFilterOverSamplingRatio(sdfm_handle h_sdfm, uint16_t osr); * * */ -void SDFM_setFilterOverSamplingRatio(sdfm_handle h_sdfm, uint16_t nc_osr, uint16_t oc_osr); +void SDFM_setFilterOverSamplingRatio(sdfm_handle h_sdfm, uint16_t nc_osr); + /** @} */ diff --git a/source/current_sense/sdfm/include/sdfm_drv.h b/source/current_sense/sdfm/include/sdfm_drv.h index fc567a1..9d8e9ec 100644 --- a/source/current_sense/sdfm/include/sdfm_drv.h +++ b/source/current_sense/sdfm/include/sdfm_drv.h @@ -31,8 +31,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef _SDDF_DRV_H_ -#define _SDDF_DRV_H_ +#ifndef _SDFM_DRV_H_ +#define _SDFM_DRV_H_ #ifdef __cplusplus extern "C" { @@ -111,13 +111,12 @@ extern "C" { #define SDFM_RECFG_TRIG_OUT_SAMP_BUF ( SDFM_RECFG_BF_RECFG_TRIG_OUT_SAMP_BUF_MASK ) /** \brief IEP_CFG*/ #define IEP_DEFAULT_INC 0x1 -/** \brief IEP_CFG_EPWM_PRD */ -#define CMP0_CNT_EPWM_PRD 0x927C + /* SDFM output buffer size in 32-bit words */ -#define ICSSG_SD_SAMP_CH_BUF_SZ 128 +#define ICSSG_SD_SAMP_CH_BUF_SZ ( 128 ) #define NUM_CH_SUPPORTED ( 3 ) /* ========================================================================== */ @@ -148,14 +147,14 @@ typedef struct SDFM_CfgSdClk_s */ typedef struct SDFM_CfgTrigger_s { - /**< time to start sampling after trigger input */ - volatile uint32_t trig_samp_time; - /**< IEP0 counts in OC sampling period*/ - volatile uint16_t oc_prd_iep_cnt; - /**< IEP0 counts in NC sampling period*/ - volatile uint16_t nc_prd_iep_cnt; - /**< OC Sample count for one NC sample*/ - volatile uint16_t sample_count; + /**< bit-field for enable double update */ + volatile uint16_t en_double_nc_sampling; + /**< First sample starting point */ + volatile uint32_t first_samp_trig_time; + /**