diff --git a/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd b/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd index 69640f4..8b8309d 100644 --- a/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd +++ b/examples/current_sense/icss_sdfm/am243x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd @@ -103,6 +103,9 @@ SECTIONS .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 + + /* TCM used by ICSS PRU to write sdfm sample output */ + .gSdfmSampleOutput : {} align(4) > R5F_TCMB0 } /* 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 index 69640f4..8b8309d 100644 --- 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 @@ -103,6 +103,9 @@ SECTIONS .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 + + /* TCM used by ICSS PRU to write sdfm sample output */ + .gSdfmSampleOutput : {} align(4) > R5F_TCMB0 } /* diff --git a/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd b/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd index c4848c3..2fe832e 100644 --- a/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd +++ b/examples/current_sense/icss_sdfm/am64x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd @@ -103,6 +103,9 @@ SECTIONS .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 + + /* TCM used by ICSS PRU to write sdfm sample output */ + .gSdfmSampleOutput : {} align(4) > R5F_TCMB0 } /* diff --git a/examples/current_sense/icss_sdfm/app_sdfm.c b/examples/current_sense/icss_sdfm/app_sdfm.c index 4be6774..628559e 100644 --- a/examples/current_sense/icss_sdfm/app_sdfm.c +++ b/examples/current_sense/icss_sdfm/app_sdfm.c @@ -139,6 +139,8 @@ PRUICSS_Handle gPruIcssHandle; /* Test Sdfm handles */ sdfm_handle gHPruSdfm; +/* Sdfm output samples, written by PRU cores */ +__attribute__((section(".gSdfmSampleOutput"))) uint32_t gSdfm_sampleOutput[NUM_CH_SUPPORTED]; /* Test Sdfm parameters */ SdfmPrms gTestSdfmPrms = { @@ -156,7 +158,8 @@ SdfmPrms gTestSdfmPrms = { {0,0}}, 15, /*Over current osr: The effect count is OSR + 1*/ 128, /*Normal current osr */ - 1 /*comparator enable*/ + 1, /*comparator enable*/ + (uint32_t)&gSdfm_sampleOutput /*Output samples base address*/ }; #define PRUICSS_G_MUX_EN ( 0x1 ) /* ICSSG_SA_MX_REG:G_MUX_EN */ @@ -343,7 +346,7 @@ void sdfm_main(void *args) /* Configure SDFM */ init_sdfm(); DebugP_log("SDFM Configured!\r\n"); - + /* Start EPWM0 clock */ CSL_REG32_WR(CSL_CTRL_MMR0_CFG0_BASE + CSL_MAIN_CTRL_MMR_CFG0_EPWM_TB_CLKEN, 1); diff --git a/examples/current_sense/icss_sdfm/sdfm.c b/examples/current_sense/icss_sdfm/sdfm.c index 6459a5f..51f20ae 100644 --- a/examples/current_sense/icss_sdfm/sdfm.c +++ b/examples/current_sense/icss_sdfm/sdfm.c @@ -176,6 +176,12 @@ int32_t init_sdfm_pru_fw(uint8_t pruId, SdfmPrms *pSdfmPrms, sdfm_handle *pHSdfm /* Initialize SDFM instance */ hSdfm = SDFM_init(pruId); + + uint32_t i; + i = SDFM_getFirmwareVersion(hSdfm); + DebugP_log("\n\n\n"); + DebugP_log("SDFM firmware version \t: %x.%x.%x (%s)\n\n", (i >> 24) & 0x7F, + (i >> 16) & 0xFF, i & 0xFFFF, i & (1 << 31) ? "internal" : "release"); if (hSdfm == NULL) { return SDFM_ERR_INIT_SDFM; @@ -184,6 +190,9 @@ int32_t init_sdfm_pru_fw(uint8_t pruId, SdfmPrms *pSdfmPrms, sdfm_handle *pHSdfm uint8_t SDFM_CH; hSdfm->iep_clock = pSdfmPrms->iep_clock; hSdfm->sdfm_clock = pSdfmPrms->sd_clock; + hSdfm->sampleOutputInterface = (SDFM_SampleOutInterface *)(pSdfmPrms->samplesBaseAddress); + uint32_t sampleOutputInterfaceGlobalAddr = CPU0_BTCM_SOCVIEW(pSdfmPrms->samplesBaseAddress); + hSdfm->p_sdfm_interface->sampleBufferBaseAdd = sampleOutputInterfaceGlobalAddr; hSdfm->iep_inc = 1; /* Default IEP increment 1 */ @@ -198,6 +207,7 @@ int32_t init_sdfm_pru_fw(uint8_t pruId, SdfmPrms *pSdfmPrms, sdfm_handle *pHSdfm /*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++) @@ -247,7 +257,6 @@ int32_t init_sdfm_pru_fw(uint8_t pruId, SdfmPrms *pSdfmPrms, sdfm_handle *pHSdfm return SDFM_ERR_NERR; } - /* * ======== initPruSdfm ======== */ diff --git a/examples/current_sense/icss_sdfm/sdfm.h b/examples/current_sense/icss_sdfm/sdfm.h index 41bd71c..1d768bc 100644 --- a/examples/current_sense/icss_sdfm/sdfm.h +++ b/examples/current_sense/icss_sdfm/sdfm.h @@ -145,6 +145,8 @@ typedef struct SdfmPrms_s { uint16_t FilterOsr; /**< over current enable field */ uint8_t en_com; + /**< output samples base address*/ + uint32_t samplesBaseAddress; } SdfmPrms; diff --git a/source/current_sense/sdfm/driver/sdfm_drv.c b/source/current_sense/sdfm/driver/sdfm_drv.c index 7c6afa0..dcf9eb6 100644 --- a/source/current_sense/sdfm/driver/sdfm_drv.c +++ b/source/current_sense/sdfm/driver/sdfm_drv.c @@ -41,6 +41,7 @@ #include #include + //***************************************************************************** // // Defines for the API. @@ -286,7 +287,7 @@ void SDFM_configComparatorGpioPins(sdfm_handle h_sdfm, uint8_t ch,uint32_t gpio_ /* Get current (or latest) sample for the specified channel */ uint32_t SDFM_getFilterData(sdfm_handle h_sdfm, uint8_t ch) { - return h_sdfm->p_sdfm_interface->curr_out_samp_buf[ch]; + return h_sdfm->sampleOutputInterface->sampleOutput[ch]; } /*Configure normal current OSR for data filter*/ @@ -300,6 +301,11 @@ void SDFM_setFilterOverSamplingRatio(sdfm_handle h_sdfm, uint16_t nc_osr) count = (int)((float)nc_osr*((float)iep_freq/(float)sd_clock)); h_sdfm->p_sdfm_interface->sdfm_cfg_trigger.nc_prd_iep_cnt = count; } +/*return firmware version */ +uint64_t SDFM_getFirmwareVersion(sdfm_handle h_sdfm) +{ + return h_sdfm->p_sdfm_interface->firmwareVersion; +} /* SDFM global enable */ void SDFM_enable(sdfm_handle h_sdfm) { diff --git a/source/current_sense/sdfm/firmware/firmware_version.h b/source/current_sense/sdfm/firmware/firmware_version.h new file mode 100644 index 0000000..c53026f --- /dev/null +++ b/source/current_sense/sdfm/firmware/firmware_version.h @@ -0,0 +1,70 @@ + +; +; Copyright (C) 2023 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. +; + + .if !$isdefed("__firmware_version_h") +__firmware_version_h .set 1 + +; ICSS_FIRMWARE_RELEASE_1: +; bit 31..16 reserved +; bit15..8 device number +FIRMWARE_DEVICE_AM335x .set 0 ; AM335x +FIRMWARE_DEVICE_AM437x .set 1 ; AM437x +FIRMWARE_DEVICE_AM64x_AM243x .set 2 ; AM64x_AM243x + +; bit7..0 protocol type +FIRMWARE_PROTOCOL_TYPE_PROFIBUS_SLAVE .set 0x00 +FIRMWARE_PROTOCOL_TYPE_ETHERCAT_SLAVE .set 0x01 +FIRMWARE_PROTOCOL_TYPE_PROFINET_DEVICE .set 0x02 +FIRMWARE_PROTOCOL_TYPE_SERCOS_SLAVE .set 0x03 +FIRMWARE_PROTOCOL_TYPE_OPENMAC_SLAVE .set 0x04 +FIRMWARE_PROTOCOL_TYPE_ETHERNET .set 0x05 +FIRMWARE_PROTOCOL_TYPE_ENETIP_SLAVE .set 0x06 +FIRMWARE_PROTOCOL_TYPE_ENDAT_MASTER .set 0x07 +FIRMWARE_PROTOCOL_TYPE_TAMAGAWA .set 0x08 +FIRMWARE_PROTOCOL_TYPE_SDFM .set 0x09 + +; ICSS_FIRMWARE_RELEASE_2: +; bit31 release or internal version +FIRMWARE_VERSION_RELEASE .set 0 +FIRMWARE_VERSION_INTERNAL .set 1 +; bit30..24 version number +FIRMWARE_VERSION_REVISION .set 0x01 +; bit23..16 major number +FIRMWARE_VERSION_MAJOR .set 0x00 +; bit15..0 minor number +FIRMWARE_VERSION_MINOR .set 0x0000 + +ICSS_FIRMWARE_RELEASE_1 .set ((FIRMWARE_DEVICE_AM64x_AM243x << 8) | (FIRMWARE_PROTOCOL_TYPE_SDFM << 0)) +ICSS_FIRMWARE_RELEASE_2 .set ((FIRMWARE_VERSION_RELEASE << 31) | (FIRMWARE_VERSION_REVISION << 24) | (FIRMWARE_VERSION_MAJOR << 16) | (FIRMWARE_VERSION_MINOR << 0)) + + .endif diff --git a/source/current_sense/sdfm/firmware/icssg_sdfm.h b/source/current_sense/sdfm/firmware/icssg_sdfm.h index 0f307d4..7cff31b 100644 --- a/source/current_sense/sdfm/firmware/icssg_sdfm.h +++ b/source/current_sense/sdfm/firmware/icssg_sdfm.h @@ -198,12 +198,17 @@ #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 ) +/* output sample buffer base address offset*/ +#define SDFM_CFG_OUT_SAMP_BUF_BASE_ADD_OFFSET ( 0xF8 ) + +/*Firmware version offset*/ +#define SDFM_FIRMWARE_VERSION_OFFSET (0xFC) /*Debug */ #define SDFM_DUBUG_OFFSET ( 0x104 ) +/*output sample offset*/ +#define SDFM_CFG_OUT_SAMP_BUF_OFFSET (0x00) /* Firmware register bit fields */ diff --git a/source/current_sense/sdfm/firmware/sdfm.asm b/source/current_sense/sdfm/firmware/sdfm.asm index 4437456..f8de5d5 100644 --- a/source/current_sense/sdfm/firmware/sdfm.asm +++ b/source/current_sense/sdfm/firmware/sdfm.asm @@ -36,6 +36,7 @@ %} .include "sdfm.h" .include "sdfm_macros.h" + .include "firmware_version.h" @@ -82,7 +83,9 @@ OUT_SAMP_BUF: .usect ".outSamps", ICSSG_NUM_SD_CH_FW*4, 4 SDFM_ENTRY: ; Clear registers R0-R30 ZERO &R0, 124 - + LDI32 TEMP_REG0, ICSS_FIRMWARE_RELEASE_1 + LDI32 TEMP_REG1, ICSS_FIRMWARE_RELEASE_2 + SBCO &TEMP_REG0, CT_PRU_ICSSG_LOC_DMEM, SDFM_FIRMWARE_VERSION_OFFSET, 8 ; Disable Task Manager ;.word 0x32000000 M_PRU_TM_DISABLE @@ -490,7 +493,8 @@ comp_ch2_end: .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 + LBCO &TEMP_REG0, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_OUT_SAMP_BUF_BASE_ADD_OFFSET,4 + SBBO &TEMP_REG3, TEMP_REG0, SDFM_CFG_OUT_SAMP_BUF_OFFSET, ICSSG_NUM_SD_CH_FW*4 ; Trigger interrupt LDI R31.w0, TRIGGER_HOST_SDFM_IRQ .endif @@ -623,7 +627,8 @@ 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 + LBCO &TEMP_REG0, CT_PRU_ICSSG_LOC_DMEM, SDFM_CFG_OUT_SAMP_BUF_BASE_ADD_OFFSET,4 + SBBO &TEMP_REG3, TEMP_REG0, 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 diff --git a/source/current_sense/sdfm/firmware/sdfm_bin.h b/source/current_sense/sdfm/firmware/sdfm_bin.h index 2812043..9f84296 100644 --- a/source/current_sense/sdfm/firmware/sdfm_bin.h +++ b/source/current_sense/sdfm/firmware/sdfm_bin.h @@ -1,5 +1,10 @@ const uint32_t pru_SDFM_PRU0_image_0[] = { 0x2effbd80, +0x240000c1, +0x24020981, +0x240100c2, +0x24000082, +0x81fc7881, 0x32000000, 0x240fff81, 0x81000a81, @@ -16,9 +21,9 @@ const uint32_t pru_SDFM_PRU0_image_0[] = { 0x91340401, 0x1f01e1e1, 0x81340401, -0x2300fd99, +0x23010399, 0x32800000, -0x23010499, +0x23010a99, 0x240c00c2, 0x24000082, 0x91021801, @@ -42,11 +47,11 @@ const uint32_t pru_SDFM_PRU0_image_0[] = { 0x0b04e1e1, 0x110fe1e2, 0x10020256, -0x23011e99, -0x23016e99, -0x23012299, -0x23013399, -0x23016599, +0x23012499, +0x23017499, +0x23012899, +0x23013999, +0x23016b99, 0x1f19fefe, 0x240fffd5, 0x24ffff95, @@ -60,7 +65,7 @@ const uint32_t pru_SDFM_PRU0_image_0[] = { 0x81001a01, 0x9114189a, 0xd1009a02, -0x21003d00, +0x21004200, 0xc9019a26, 0x10161602, 0x09020202, @@ -230,7 +235,7 @@ const uint32_t pru_SDFM_PRU0_image_0[] = { 0x00e1e2e1, 0x81983a81, 0x01011c1c, -0x79000010, +0x79000011, 0xd1003c07, 0xc9007c06, 0x91f03881, @@ -244,7 +249,8 @@ const uint32_t pru_SDFM_PRU0_image_0[] = { 0x2400003c, 0x2400001c, 0xf100b484, -0x81f8b884, +0x91f83881, +0xe100a184, 0x2400229f, 0x24000000, 0x2f852381, @@ -254,7 +260,7 @@ const uint32_t pru_SDFM_PRU0_image_0[] = { 0x10000000, 0x24000b01, 0x81000a01, -0x2400b181, +0x2400b681, 0x810c0a81, 0x24140081, 0x81380a81, @@ -295,10 +301,10 @@ const uint32_t pru_SDFM_PRU0_image_0[] = { 0x110f0203, 0x68160303, 0x911e1801, -0x21012e00, +0x21013400, 0x68360303, 0x91621801, -0x21012e00, +0x21013400, 0x68560302, 0x91a61801, 0x0903e3e3, @@ -323,7 +329,7 @@ const uint32_t pru_SDFM_PRU0_image_0[] = { 0x09044141, 0x11304141, 0x12410101, -0x21016000, +0x21016600, 0x6836030e, 0x24000081, 0x917c1841, @@ -337,7 +343,7 @@ const uint32_t pru_SDFM_PRU0_image_0[] = { 0x09044141, 0x11304141, 0x12410101, -0x21016000, +0x21016600, 0x6856030d, 0x24000081, 0x91c01841, diff --git a/source/current_sense/sdfm/include/sdfm_api.h b/source/current_sense/sdfm/include/sdfm_api.h index e655fdf..5b11098 100644 --- a/source/current_sense/sdfm/include/sdfm_api.h +++ b/source/current_sense/sdfm/include/sdfm_api.h @@ -286,8 +286,16 @@ uint32_t SDFM_getFilterData(sdfm_handle h_sdfm,uint8_t ch); * */ void SDFM_setFilterOverSamplingRatio(sdfm_handle h_sdfm, uint16_t nc_osr); - - +/** + * + * \brief Return Firmware version + * + * \param[in] h_sdfm SDFM handle + * + * \retval firmwareVersion release vesrion of firmware + * + */ +uint64_t SDFM_getFirmwareVersion(sdfm_handle h_sdfm); /** @} */ #ifdef __cplusplus diff --git a/source/current_sense/sdfm/include/sdfm_drv.h b/source/current_sense/sdfm/include/sdfm_drv.h index 9d8e9ec..c9c2d9a 100644 --- a/source/current_sense/sdfm/include/sdfm_drv.h +++ b/source/current_sense/sdfm/include/sdfm_drv.h @@ -113,6 +113,7 @@ extern "C" { #define IEP_DEFAULT_INC 0x1 + /* SDFM output buffer size in 32-bit words */ @@ -293,10 +294,16 @@ typedef struct SDFM_Interface_s{ SDFM_Cfg sdfm_cfg_ptr[NUM_CH_SUPPORTED]; /*