diff options
| author | shuta.lst <[email protected]> | 2026-02-25 11:00:35 +0800 |
|---|---|---|
| committer | shuta.lst <[email protected]> | 2026-02-25 11:23:09 +0800 |
| commit | 7bf83088b8ef82aea8d182c2b0a8991aa9ddb3da (patch) | |
| tree | 6e35f25d2e5d8725cd3e3a46a2dcc4497fe6beb1 | |
| parent | 1d796d5fded025719dd57a16b545621cadca65eb (diff) | |
Support XuanTie E906 CPU
- Place the E906 implementation in the ports/risc-v32/gnu directory;
- Remove code unrelated to the xuantie_smartl_fpga demo;
136 files changed, 39 insertions, 29654 deletions
diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/CMakeLists.txt b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/CMakeLists.txt index ed803a64..0d8c22ea 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/CMakeLists.txt +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/CMakeLists.txt @@ -10,7 +10,6 @@ set(SRCS ${CMAKE_CURRENT_LIST_DIR}/boards/board_riscv_dummy/src/uart/board_uart.c ${CMAKE_CURRENT_LIST_DIR}/boards/board_riscv_dummy/src/board_init.c ${CMAKE_CURRENT_LIST_DIR}/components/csi/csi2/src/csi_misc.c - ${CMAKE_CURRENT_LIST_DIR}/components/csi/csi2/src/csi_ringbuf.c ${CMAKE_CURRENT_LIST_DIR}/components/libc_threadx/mini_printf.c ${CMAKE_CURRENT_LIST_DIR}/components/libc_threadx/newlib_stub.c ${CMAKE_CURRENT_LIST_DIR}/components/chip_riscv_dummy/src/arch/e906fdp/startup.S @@ -31,7 +30,7 @@ set(SRCS ) include_directories( - ${CMAKE_CURRENT_LIST_DIR}/../../../../../../common/inc + ${CMAKE_CURRENT_LIST_DIR}/../../../../../common/inc ${CMAKE_CURRENT_LIST_DIR}/../../inc ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/boards/board_riscv_dummy/include @@ -67,7 +66,7 @@ add_link_options( -Wl,-Map=${PROJECT_NAME}.map ) -link_directories(${CMAKE_CURRENT_LIST_DIR}/../../../../../../build) +link_directories(${CMAKE_CURRENT_LIST_DIR}/../../../../../build) add_executable(${PROJECT_NAME} ${SRCS}) set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "${PROJECT_NAME}.elf") target_link_libraries(${PROJECT_NAME} PRIVATE threadx) diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/boards/board_riscv_dummy/include/board.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/boards/board_riscv_dummy/include/board.h index 6d5b756c..a0f81d7a 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/boards/board_riscv_dummy/include/board.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/boards/board_riscv_dummy/include/board.h @@ -17,7 +17,7 @@ */ /* - This is an example board.h for Board Compment, New Board should flow the macro defines. + This is an example board.h for Board Component, New Board should follow the macro defines. */ #ifndef __BOARD_H__ @@ -44,7 +44,7 @@ extern "C" { · WIFI · BT · AUDIO - BOARD_XXX Macro descripted below should be defined if the board support. + BOARD_XXX Macro described below should be defined if the board support. */ /****************************************************************************/ @@ -120,8 +120,8 @@ extern "C" { // UART /* - The total supported uart numbers on this board, 0 meas No uart support. - the BOARD_UART<x>_XXX, x in rang of (0, BOARD_UART_NUM - 1) + The total supported uart numbers on this board, 0 means No uart support. + the BOARD_UART<x>_XXX, x in range of (0, BOARD_UART_NUM - 1) */ #ifndef BOARD_UART_NUM #define BOARD_UART_NUM (1) @@ -441,4 +441,4 @@ void board_audio_init(void); } #endif -#endif /* __BOARD_H__ */
\ No newline at end of file +#endif /* __BOARD_H__ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/boards/board_riscv_dummy/include/csi_config.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/boards/board_riscv_dummy/include/csi_config.h index 8e1af58f..8e1af58f 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/boards/board_riscv_dummy/include/csi_config.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/boards/board_riscv_dummy/include/csi_config.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/boards/board_riscv_dummy/src/board_init.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/boards/board_riscv_dummy/src/board_init.c index b994f6ce..b994f6ce 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/boards/board_riscv_dummy/src/board_init.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/boards/board_riscv_dummy/src/board_init.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/boards/board_riscv_dummy/src/uart/board_uart.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/boards/board_riscv_dummy/src/uart/board_uart.c index 315e3aed..315e3aed 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/boards/board_riscv_dummy/src/uart/board_uart.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/boards/board_riscv_dummy/src/uart/board_uart.c diff --git a/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/build_libthreadx.sh b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/build_libthreadx.sh new file mode 100755 index 00000000..ff9bb930 --- /dev/null +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/build_libthreadx.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +pushd ../../../../../ +rm -rf build +cmake -Bbuild -GNinja -DCMAKE_TOOLCHAIN_FILE=ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/xuantie_e906_gnu.cmake . +cmake --build ./build/ +popd diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/build_threadx_sample.sh b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/build_threadx_sample.sh index ec91e36a..ec91e36a 100755 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/build_threadx_sample.sh +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/build_threadx_sample.sh diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/gcc_flash_smartl.ld b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/gcc_flash_smartl.ld index 3cfad67d..3cfad67d 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/gcc_flash_smartl.ld +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/gcc_flash_smartl.ld diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/asm/riscv_asm_macro.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/asm/riscv_asm_macro.h index dfa08578..dfa08578 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/asm/riscv_asm_macro.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/asm/riscv_asm_macro.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/asm/riscv_csr.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/asm/riscv_csr.h index 0bea1b57..0bea1b57 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/asm/riscv_csr.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/asm/riscv_csr.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/drv/dev_tag.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/drv/dev_tag.h index 4e7590c4..4e7590c4 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/drv/dev_tag.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/drv/dev_tag.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/dw_timer_ll.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/dw_timer_ll.h index cb7bf108..cb7bf108 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/dw_timer_ll.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/dw_timer_ll.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/dw_uart.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/dw_uart.h index e69de29b..e69de29b 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/dw_uart.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/dw_uart.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/dw_uart_ll.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/dw_uart_ll.h index 50a7de0b..50a7de0b 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/dw_uart_ll.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/dw_uart_ll.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/soc.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/soc.h index e77cb305..e77cb305 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/soc.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/soc.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/sys_clk.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/sys_clk.h index 3d74f5e9..3d74f5e9 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/include/sys_clk.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/include/sys_clk.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/startup.S b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/startup.S index 2c6f8c3e..2c6f8c3e 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/startup.S +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/startup.S diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/system.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/system.c index 4b20c58f..468eeda3 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/system.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/system.c @@ -22,8 +22,6 @@ #include <drv/irq.h> #include <drv/dma.h> #include <drv/tick.h> -#include <drv/etb.h> -#include <drv/spiflash.h> #include "riscv_csr.h" #if (defined(CONFIG_KERNEL_RHINO) || defined(CONFIG_KERNEL_FREERTOS) || defined(CONFIG_KERNEL_RTTHREAD)) && defined(CONFIG_KERNEL_NONE) diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/trap_c.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/trap_c.c index f36e86b2..f36e86b2 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/trap_c.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/trap_c.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/vectors.S b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/vectors.S index 5c0aabb2..20840bc5 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/vectors.S +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/arch/e906fdp/vectors.S @@ -896,3 +896,5 @@ is_interrupt: .weak \handler_name .set \handler_name, Default_Handler .endm + + def_irq_handler tspend_handler diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/drivers/dw_uart_ll.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/drivers/dw_uart_ll.c index 15ae00be..15ae00be 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/drivers/dw_uart_ll.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/drivers/dw_uart_ll.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/drivers/uart.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/drivers/uart.c index 5f335b4d..5f335b4d 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/drivers/uart.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/drivers/uart.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/devices.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/devices.c index 3979c41d..48011f2a 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/devices.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/devices.c @@ -22,10 +22,10 @@ #include <drv/uart.h> #include <drv/timer.h> #include <drv/dma.h> -#include <drv/iic.h> -#include <drv/rtc.h> -#include <drv/spi.h> -#include <drv/adc.h> +// #include <drv/iic.h> +// #include <drv/rtc.h> +// #include <drv/spi.h> +// #include <drv/adc.h> #include <drv/gpio.h> #include <drv/irq.h> #include <drv/pin.h> diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/feature.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/feature.c index 018011df..018011df 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/feature.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/feature.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/irq.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/irq.c index dd38678e..dd38678e 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/irq.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/irq.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/irq_port.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/irq_port.c index 8caa0588..8caa0588 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/irq_port.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/irq_port.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/pre_main.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/pre_main.c index 99e207c5..99e207c5 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/pre_main.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/pre_main.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/sys_clk.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/sys_clk.c index f79105e8..2ef6f11e 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/sys_clk.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/sys_clk.c @@ -19,7 +19,7 @@ #include <stdint.h> #include <soc.h> #include <sys_clk.h> -#include <drv/io.h> +// #include <drv/io.h> uint32_t g_system_clock = IHS_VALUE; diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/target_get.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/target_get.c index da53b1df..da53b1df 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/target_get.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/target_get.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/tick.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/tick.c index 1f121916..1f121916 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/tick.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/tick.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/weak.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/weak.c index d6e32655..d6e32655 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/weak.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/weak.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/README.txt b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/README.txt index bb1bf4a3..bb1bf4a3 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/README.txt +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/README.txt diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/core_rv32.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/core_rv32.h index c46e8428..c46e8428 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/core_rv32.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/core_rv32.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/core_rv64.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/core_rv64.h index c5463e93..c5463e93 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/core_rv64.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/core_rv64.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/csi_rv32_gcc.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/csi_rv32_gcc.h index 4c7d540c..4c7d540c 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/csi_rv32_gcc.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/csi_rv32_gcc.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/csi_rv64_gcc.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/csi_rv64_gcc.h index 9878668e..9878668e 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/csi_rv64_gcc.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/csi_rv64_gcc.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/csi_rv_common.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/csi_rv_common.h index 4a57b718..4a57b718 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/csi_rv_common.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/csi_rv_common.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/csi_rv_encoding.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/csi_rv_encoding.h index 82df61a9..82df61a9 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/csi_rv_encoding.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/core/csi_rv_encoding.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/csi_core.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/csi_core.h index bbb859ff..bbb859ff 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/csi_core.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/csi_core.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/clk.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/clk.h index 9e9ee03e..9e9ee03e 100755 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/clk.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/clk.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/common.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/common.h index c2c2f84f..c2c2f84f 100755 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/common.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/common.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/dma.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/dma.h index 7dcf5b5c..7dcf5b5c 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/dma.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/dma.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/gpio.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/gpio.h index fb8aed65..fb8aed65 100755 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/gpio.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/gpio.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/irq.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/irq.h index 6272d15b..6272d15b 100755 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/irq.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/irq.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/list.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/list.h index 9f65050c..9f65050c 100755 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/list.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/list.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/pin.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/pin.h index d1a614b6..d1a614b6 100755 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/pin.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/pin.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/porting.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/porting.h index 6ea647a1..6ea647a1 100755 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/porting.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/porting.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/tick.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/tick.h index a5e0a3f1..a5e0a3f1 100755 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/tick.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/tick.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/timer.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/timer.h index 9f1039c1..9f1039c1 100755 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/timer.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/timer.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/uart.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/uart.h index 20ecc29d..20ecc29d 100755 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/uart.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/drv/uart.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/syslog.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/syslog.h index 063649c8..063649c8 100755 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/syslog.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/include/syslog.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/src/csi_misc.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/src/csi_misc.c index f9fd6ee2..f9fd6ee2 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/src/csi_misc.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/csi/csi2/src/csi_misc.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/compilers/gcc/sys/ioctl.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/compilers/gcc/sys/ioctl.h index 8ab7ef9a..8ab7ef9a 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/compilers/gcc/sys/ioctl.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/compilers/gcc/sys/ioctl.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/compilers/gcc/sys/termios.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/compilers/gcc/sys/termios.h index 137d937c..137d937c 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/compilers/gcc/sys/termios.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/compilers/gcc/sys/termios.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/compilers/gcc/time.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/compilers/gcc/time.h index febb819e..febb819e 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/compilers/gcc/time.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/compilers/gcc/time.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/errno.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/errno.h index 0c280ce2..0c280ce2 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/errno.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/errno.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/inttypes.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/inttypes.h index cd8b619a..cd8b619a 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/inttypes.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/inttypes.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/serf/minilibc_stdio.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/serf/minilibc_stdio.h index 67b6bb40..67b6bb40 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/serf/minilibc_stdio.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/serf/minilibc_stdio.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/sys/_stdint.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/sys/_stdint.h index 88d8fe4d..88d8fe4d 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/sys/_stdint.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/sys/_stdint.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/sys/random.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/sys/random.h index bce4b7f7..bce4b7f7 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/sys/random.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/sys/random.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/sys/select.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/sys/select.h index 56f479c3..56f479c3 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/sys/select.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/sys/select.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/sys/time.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/sys/time.h index 0e4ed9d5..0e4ed9d5 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/include/sys/time.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/include/sys/time.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/mini_printf.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/mini_printf.c index e1aea6e6..e1aea6e6 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/mini_printf.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/mini_printf.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/newlib_stub.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/newlib_stub.c index 593d8572..593d8572 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/libc_threadx/newlib_stub.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/components/libc_threadx/newlib_stub.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/demo_threadx.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/demo_threadx.c index 5f17f954..5f17f954 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/demo_threadx.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/demo_threadx.c diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/gdbinit b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/gdbinit index 1042ec78..1042ec78 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/gdbinit +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/gdbinit diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/pre_main.c b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/pre_main.c index 7227633d..7227633d 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/pre_main.c +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/pre_main.c diff --git a/ports/xuantie/e906/gnu/readme_threadx.txt b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/readme_e906.txt index 56189b6e..2ffd7618 100644 --- a/ports/xuantie/e906/gnu/readme_threadx.txt +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/readme_e906.txt @@ -17,13 +17,13 @@ Verify the toolchain: riscv64-unknown-elf-objdump --version Library build script - ports/xuantie/e906/gnu/example_build/smartl_fpga/build_libthreadx.sh + build_libthreadx.sh Example build script The example demonstration contains a build script. See: - ports/xuantie/e906/gnu/example_build/smartl_fpga/build_threadx_sample.sh + build_threadx_sample.sh This script builds the library and the demo application demo_threadx.elf. @@ -63,85 +63,7 @@ Board Initialization (board_init.c) Then jump to main(). -4. Register Usage and Stack Frames - -The RISC-V32 ABI defines t0-t6 and a0-a7 as caller-saved (temporary) registers. -All other registers used by a function must be preserved by the function. - -Stack Layout for Task Frame (with FP double and P-extension enabled): - - Index Offset Register Description - ───────────────────────────────────────────────── - 0 0x00 mepc machine exception PC - 1 0x04 ra return address - 2 0x08 t0 temporary register 0 - 3 0x0C t1 temporary register 1 - 4 0x10 t2 temporary register 2 - 5 0x14 s0 saved register 0 or frame pointer - 6 0x18 s1 saved register 1 - 7 0x1C a0 argument register 0 - 8 0x20 a1 argument register 1 - 9 0x24 a2 argument register 2 - 10 0x28 a3 argument register 3 - 11 0x2C a4 argument register 4 - 12 0x30 a5 argument register 5 - 13 0x34 a6 argument register 6 - 14 0x38 a7 argument register 7 - 15 0x3C s2 saved register 2 - 16 0x40 s3 saved register 3 - 17 0x44 s4 saved register 4 - 18 0x48 s5 saved register 5 - 19 0x4C s6 saved register 6 - 20 0x50 s7 saved register 7 - 21 0x54 s8 saved register 8 - 22 0x58 s9 saved register 9 - 23 0x5C s10 saved register 10 - 24 0x60 s11 saved register 11 - 25 0x64 t3 temporary register 3 - 26 0x68 t4 temporary register 4 - 27 0x6C t5 temporary register 5 - 28 0x70 t6 temporary register 6 - 29 0x74 mstatus machine status register - - 30 0x78 fcsr FP control/status register - 31 0x7C ft0 FP temporary register 0 - 32 0x84 ft1 FP temporary register 1 - 33 0x8C ft2 FP temporary register 2 - 34 0x94 ft3 FP temporary register 3 - 35 0x9C ft4 FP temporary register 4 - 36 0xA4 ft5 FP temporary register 5 - 37 0xAC ft6 FP temporary register 6 - 38 0xB4 ft7 FP temporary register 7 - 39 0xBC fs0 FP saved register 0 - 40 0xC4 fs1 FP saved register 1 - 41 0xCC fa0 FP argument register 0 - 42 0xD4 fa1 FP argument register 1 - 43 0xDC fa2 FP argument register 2 - 44 0xE4 fa3 FP argument register 3 - 45 0xEC fa4 FP argument register 4 - 46 0xF4 fa5 FP argument register 5 - 47 0xFC fa6 FP argument register 6 - 48 0x104 fa7 FP argument register 7 - 49 0x10C fs2 FP saved register 2 - 50 0x114 fs3 FP saved register 3 - 51 0x11C fs4 FP saved register 4 - 52 0x124 fs5 FP saved register 5 - 53 0x12C fs6 FP saved register 6 - 54 0x134 fs7 FP saved register 7 - 55 0x13C fs8 FP saved register 8 - 56 0x144 fs9 FP saved register 9 - 57 0x14C fs10 FP saved register 10 - 58 0x154 fs11 FP saved register 11 - 59 0x15C ft8 FP temporary register 8 - 60 0x164 ft9 FP temporary register 9 - 61 0x16C ft10 FP temporary register 10 - 62 0x174 ft11 FP temporary register 11 - - 63 0x17C vxsat fixed-point saturation flag register - ───────────────────────────────────────────────── - - -5. Interrupt Handling +4. Interrupt Handling Machine Mode Operation @@ -153,11 +75,11 @@ Interrupt Sources 1. Machine Timer Interrupt (MTI): - Triggered by CLINT when mtime >= mtimecmp - Handled by _tx_timer_interrupt (src/tx_timer_interrupt.c) - - Called from tick_irq_handler() in example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/tick.c + - Called from tick_irq_handler() in example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/tick.c 2. External Interrupts (MEI): - Routed through CLIC - - Handled by do_irq() in example_build/smartl_fpga/components/chip_riscv_dummy/src/sys/irq.c + - Handled by do_irq() in example_build/xuantie_smartl_fpga/components/chip_riscv_dummy/src/sys/irq.c 3. Software Interrupts (MSI): - Routed through CLIC @@ -175,7 +97,7 @@ These are defined in ports/xuantie/e906/gnu/inc/tx_port.h and use the _tx_thread_interrupt_control() function. -6. Thread Scheduling and Context Switching +5. Thread Scheduling and Context Switching Fist Thread Switch (src/tx_thread_schedule.S) 1. Enables interrupts while waiting a thread @@ -204,7 +126,7 @@ New threads start with a fake interrupt frame containing: - Floating-point registers initialized based on ABI -7. Port Configuration and Macros +6. Port Configuration and Macros Default Configurations (in ports/risc-v64/gnu/inc/tx_port.h): @@ -216,9 +138,9 @@ Default Configurations (in ports/risc-v64/gnu/inc/tx_port.h): These can be overridden in tx_user.h or on the compiler command line. -8. Build Configuration +7. Build Configuration -CMake Toolchain File: example_build/smartl_fpga/xuantie_e906_gnu.cmake +CMake Toolchain File: example_build/xuantie_smartl_fpga/xuantie_e906_gnu.cmake Compiler Flags: -mcpu=e906fdp RISC-V RV32IMA[F][D]C[P] @@ -226,22 +148,9 @@ Compiler Flags: -D__ASSEMBLER__ For assembly files -9. File Organization - -Port-specific files (ports/risc-v64/gnu/): - -Core assembly files (src/): - - tx_port.c Initial setup and system state, Build initial stack frame for new thread - - tx_thread_context.S Thread context switch by software interrupt - - tx_thread_schedule.S Fist Thread scheduler - - tx_thread_system_return.S Trigger a software interrupt for voluntary yield - - tx_thread_interrupt_control.S Interrupt enable/disable control - - tx_timer_interrupt.S Timer interrupt handler +8. File Organization -Header file (inc/): - - tx_port.h Port-specific defines and macros - -Example files (example_build/smartl_fpga/): +Example files (example_build/xuantie_smartl_fpga/): - components/chip_riscv_dummy/src/arch/e906fdp Startup code, Interrupt handlers - components/chip_riscv_dummy/src/drivers The basic peripheral drivers for the platform - components/chip_riscv_dummy/src/sys System initialization @@ -254,7 +163,7 @@ Example files (example_build/smartl_fpga/): - build_libthreadx.sh Build script -10. Linker Script Requirements +9. Linker Script Requirements The linker script must provide: @@ -275,7 +184,7 @@ The linker script must provide: 4. Alignment: - 4-byte alignment throughout -11. Performance and Debugging +10. Performance and Debugging Performance Optimization @@ -307,27 +216,20 @@ Useful GDB commands: (gdb) p *_tx_thread_current_ptr # View current thread control block -12. Platform-Specific Notes (QEMU smartl) +11. Platform-Specific Notes (QEMU smartl) See https://www.xrvm.com/soft-tools/tools/QEMU Timer frequency is platform-dependent (example uses 100MHz). -13. Revision History +12. Revision History -For generic code revision information, refer to ports/risc-v64/gnu/readme_threadx.txt. +For generic code revision information, refer to ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/readme_e906.txt. The following details the revision history for this xuantie/e906 GNU port: 12-02-2026 Steven Lin Support XuanTie E906 -01-26-2026 Akif Ejaz Comprehensive rewrite with accurate - technical details matching implementation, - register naming per RISC-V ABI, and - complete interrupt flow documentation - -03-08-2023 Scott Larson Initial Version 6.2.1 - Copyright (c) 1996-2026 Microsoft Corporation diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/tx_user.h b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/tx_user.h index 896e2233..896e2233 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/tx_user.h +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/tx_user.h diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/xuantie_e906_gnu.cmake b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/xuantie_e906_gnu.cmake index 2f6e9d91..b724b0d7 100644 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/xuantie_e906_gnu.cmake +++ b/ports/risc-v32/gnu/example_build/xuantie_smartl_fpga/xuantie_e906_gnu.cmake @@ -4,7 +4,7 @@ set(CMAKE_SYSTEM_PROCESSOR xuantie_e906) set(THREADX_ARCH "xuantie_e906") set(THREADX_TOOLCHAIN "gnu") -set(ARCH_FLAGS "-g -mcpu=e906fdp -mcmodel=medlow") +set(ARCH_FLAGS "-g -mcpu=e906fd -mcmodel=medlow") set(CFLAGS "${ARCH_FLAGS}") set(ASFLAGS "${ARCH_FLAGS}") set(LDFLAGS "${ARCH_FLAGS}") @@ -12,4 +12,4 @@ set(LDFLAGS "${ARCH_FLAGS}") set(TX_USER_FILE ${CMAKE_CURRENT_LIST_DIR}/tx_user.h) set(THREADX_CUSTOM_PORT ${CMAKE_CURRENT_LIST_DIR}/../../) -include(${CMAKE_CURRENT_LIST_DIR}/../../../../../../cmake/riscv64-unknown-elf.cmake)
\ No newline at end of file +include(${CMAKE_CURRENT_LIST_DIR}/../../../../../cmake/riscv64-unknown-elf.cmake)
\ No newline at end of file diff --git a/ports/xuantie/e906/gnu/CMakeLists.txt b/ports/xuantie/e906/gnu/CMakeLists.txt deleted file mode 100644 index 33a3a43a..00000000 --- a/ports/xuantie/e906/gnu/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ - -target_sources(${PROJECT_NAME} - PRIVATE - # {{BEGIN_TARGET_SOURCES}} - ${CMAKE_CURRENT_LIST_DIR}/src/tx_port.c - ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_context.S - ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_interrupt_control.S - ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_schedule.S - ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_system_return.S - ${CMAKE_CURRENT_LIST_DIR}/src/tx_timer_interrupt.c - # {{END_TARGET_SOURCES}} -) - -target_include_directories(${PROJECT_NAME} - PUBLIC - ${CMAKE_CURRENT_LIST_DIR}/inc -) diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/build_libthreadx.sh b/ports/xuantie/e906/gnu/example_build/smartl_fpga/build_libthreadx.sh deleted file mode 100755 index 2f35e09e..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/build_libthreadx.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -pushd ../../../../../../ -rm -rf build -cmake -Bbuild -GNinja -DCMAKE_TOOLCHAIN_FILE=ports/xuantie/e906/gnu/example_build/smartl_fpga/xuantie_e906_gnu.cmake . -cmake --build ./build/ -popd diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/csi_gcc.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/csi_gcc.h deleted file mode 100644 index 75b42742..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/core/csi_gcc.h +++ /dev/null @@ -1,3293 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file csi_gcc.h - * @brief CSI Header File for GCC. - * @version V1.0 - * @date 02. June 2020 - ******************************************************************************/ - -#ifndef _CSI_GCC_H_ -#define _CSI_GCC_H_ - -#include <stdlib.h> -#include <stdint.h> - -#ifndef __ASM -#define __ASM __asm /*!< asm keyword for GNU Compiler */ -#endif - -#ifndef __INLINE -#define __INLINE inline /*!< inline keyword for GNU Compiler */ -#endif - -#ifndef __ALWAYS_STATIC_INLINE -#define __ALWAYS_STATIC_INLINE __attribute__((always_inline)) static inline -#endif - -#ifndef __STATIC_INLINE -#define __STATIC_INLINE static inline -#endif - -#ifndef __NO_RETURN -#define __NO_RETURN __attribute__((__noreturn__)) -#endif - -#ifndef __USED -#define __USED __attribute__((used)) -#endif - -#ifndef __WEAK -#define __WEAK __attribute__((weak)) -#endif - -#ifndef __PACKED -#define __PACKED __attribute__((packed, aligned(1))) -#endif - -#ifndef __PACKED_STRUCT -#define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif - -#ifndef __PACKED_UNION -#define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CSI_Core_FunctionInterface - \defgroup CSI_Core_RegAccFunctions CSI Core Register Access Functions - @{ - */ -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by setting the IE-bit in the PSR. - Can only be executed in Privileged modes. - */ -__ALWAYS_STATIC_INLINE void __enable_irq(void) -{ - __ASM volatile("psrset ie"); -} - - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by clearing the IE-bit in the PSR. - Can only be executed in Privileged modes. - */ -__ALWAYS_STATIC_INLINE void __disable_irq(void) -{ - __ASM volatile("psrclr ie"); -} - -/** - \brief Get PSR - \details Returns the content of the PSR Register. - \return PSR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_PSR(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, psr" : "=r"(result) :: "memory"); - return (result); -} - -/** - \brief Set PSR - \details Writes the given value to the PSR Register. - \param [in] psr PSR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_PSR(uint32_t psr) -{ - __ASM volatile("mtcr %0, psr" : : "r"(psr) : "memory"); -} - -/** - \brief Get SP - \details Returns the content of the SP Register. - \return SP Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_SP(void) -{ - uint32_t result; - - __ASM volatile("mov %0, sp" : "=r"(result)); - return (result); -} - -/** - \brief Set SP - \details Writes the given value to the SP Register. - \param [in] sp SP Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_SP(uint32_t sp) -{ - __ASM volatile("mov sp, %0" : : "r"(sp): "sp"); -} - -/** - \brief Get Int SP - \details Returns the content of the Int SP Register. - \return Int SP Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_Int_SP(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, cr<15, 1>" : "=r"(result)); - return (result); -} - -/** - \brief Set Int SP - \details Writes the given value to the Int SP Register. - \param [in] sp Int SP Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_Int_SP(uint32_t sp) -{ - __ASM volatile("mtcr %0, cr<15, 1>" : : "r"(sp)); -} - -/** - \brief Get VBR Register - \details Returns the content of the VBR Register. - \return VBR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_VBR(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, vbr" : "=r"(result)); - return (result); -} - -/** - \brief Set VBR - \details Writes the given value to the VBR Register. - \param [in] vbr VBR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_VBR(uint32_t vbr) -{ - __ASM volatile("mtcr %0, vbr" : : "r"(vbr)); -} - -/** - \brief Get EPC Register - \details Returns the content of the EPC Register. - \return EPC Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_EPC(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, epc" : "=r"(result)); - return (result); -} - -/** - \brief Set EPC - \details Writes the given value to the EPC Register. - \param [in] epc EPC Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_EPC(uint32_t epc) -{ - __ASM volatile("mtcr %0, epc" : : "r"(epc)); -} - -/** - \brief Get EPSR - \details Returns the content of the EPSR Register. - \return EPSR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_EPSR(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, epsr" : "=r"(result)); - return (result); -} - -/** - \brief Set EPSR - \details Writes the given value to the EPSR Register. - \param [in] epsr EPSR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_EPSR(uint32_t epsr) -{ - __ASM volatile("mtcr %0, epsr" : : "r"(epsr)); -} - -/** - \brief Get CPUID Register - \details Returns the content of the CPUID Register. - \return CPUID Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_CPUID(void) -{ - uint32_t result; - -#ifdef __CK610 - __ASM volatile("mfcr %0, cr13" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<13, 0>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Get CCR - \details Returns the current value of the CCR. - \return CCR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_CCR(void) -{ - register uint32_t result; - -#ifdef __CK610 - __ASM volatile("mfcr %0, cr18\n" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<18, 0>\n" : "=r"(result)); -#endif - return (result); -} - - -/** - \brief Set CCR - \details Assigns the given value to the CCR. - \param [in] ccr CCR value to set - */ -__ALWAYS_STATIC_INLINE void __set_CCR(uint32_t ccr) -{ -#ifdef __CK610 - __ASM volatile("mtcr %0, cr18\n" : : "r"(ccr)); -#else - __ASM volatile("mtcr %0, cr<18, 0>\n" : : "r"(ccr)); -#endif -} - -/** - \brief Get CCR2 - \details Returns the current value of the CCR2. - \return CCR2 Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_CCR2(void) -{ - register uint32_t result; - - __ASM volatile("mfcr %0, cr<31, 0>\n" : "=r"(result)); - return (result); -} - -/** - \brief Set CCR2 - \details Assigns the given value to the CCR2. - \param [in] ccr2 CCR2 value to set - */ -__ALWAYS_STATIC_INLINE void __set_CCR2(uint32_t ccr2) -{ - __ASM volatile("mtcr %0, cr<31, 0>\n" : : "r"(ccr2)); -} - -/** - \brief Get DCSR - \details Returns the content of the DCSR Register. - \return DCSR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_DCSR(void) -{ - uint32_t result; -#ifdef __CK610 - __ASM volatile("mfcr %0, cr14" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<14, 0>" : "=r"(result)); -#endif - return (result); -} - - -/** - \brief Set DCSR - \details Writes the given value to the DCSR Register. - \param [in] dcsr DCSR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_DCSR(uint32_t dcsr) -{ -#ifdef __CK610 - __ASM volatile("mtcr %0, cr14" : : "r"(dcsr)); -#else - __ASM volatile("mtcr %0, cr<14, 0>" : : "r"(dcsr)); -#endif -} - - -/** - \brief Get CFR - \details Returns the content of the CFR Register. - \return CFR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_CFR(void) -{ - uint32_t result; -#ifdef __CK610 - __ASM volatile("mfcr %0, cr17" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<17, 0>" : "=r"(result)); -#endif - - return (result); -} - - -/** - \brief Set CFR - \details Writes the given value to the CFR Register. - \param [in] cfr CFR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_CFR(uint32_t cfr) -{ -#ifdef __CK610 - __ASM volatile("mtcr %0, cr17" : : "r"(cfr)); -#else - __ASM volatile("mtcr %0, cr<17, 0>" : : "r"(cfr)); -#endif -} - - -/** - \brief Get CIR - \details Returns the content of the CIR Register. - \return CIR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_CIR(void) -{ - uint32_t result; -#ifdef __CK610 - __ASM volatile("mfcr %0, cr22" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<22, 0>" : "=r"(result)); -#endif - return (result); -} - - -/** - \brief Set CIR - \details Writes the given value to the CIR Register. - \param [in] cir CIR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_CIR(uint32_t cir) -{ -#ifdef __CK610 - __ASM volatile("mtcr %0, cr22" : : "r"(cir)); -#else - __ASM volatile("mtcr %0, cr<22, 0>" : : "r"(cir)); -#endif -} - -/** - \brief Get ERRLC - \details Returns the current value of the ERRLC. - \return ERRLC Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_ERRLC(void) -{ - register uint32_t result; - - __ASM volatile("mfcr %0, cr<6, 1>\n" : "=r"(result)); - return (result); -} - -/** - \brief Set ERRLC - \details Assigns the given value to the ERRLC. - \param [in] errlc ERRLC value to set - */ -__ALWAYS_STATIC_INLINE void __set_ERRLC(uint32_t errlc) -{ - __ASM volatile("mtcr %0, cr<6, 1>\n" : : "r"(errlc)); -} - -/** - \brief Get ERRADDR - \details Returns the current value of the ERRADDR. - \return ERRADDR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_ERRADDR(void) -{ - register uint32_t result; - - __ASM volatile("mfcr %0, cr<7, 1>\n" : "=r"(result)); - return (result); -} - -/** - \brief Set ERRADDR - \details Assigns the given value to the ERRADDR. - \param [in] erraddr ERRADDR value to set - */ -__ALWAYS_STATIC_INLINE void __set_ERRADDR(uint32_t erraddr) -{ - __ASM volatile("mtcr %0, cr<7, 1>\n" : : "r"(erraddr)); -} - -/** - \brief Get ERRSTS - \details Returns the current value of the ERRSTS. - \return ERRSTS Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_ERRSTS(void) -{ - register uint32_t result; - - __ASM volatile("mfcr %0, cr<8, 1>\n" : "=r"(result)); - return (result); -} - -/** - \brief Set ERRSTS - \details Assigns the given value to the ERRSTS. - \param [in] errsts ERRSTS value to set - */ -__ALWAYS_STATIC_INLINE void __set_ERRSTS(uint32_t errsts) -{ - __ASM volatile("mtcr %0, cr<8, 1>\n" : : "r"(errsts)); -} - -/** - \brief Get ERRINJCR - \details Returns the current value of the ERRINJCR. - \return ERRINJCR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_ERRINJCR(void) -{ - register uint32_t result; - - __ASM volatile("mfcr %0, cr<9, 1>\n" : "=r"(result)); - return (result); -} - -/** - \brief Set ERRINJCR - \details Assigns the given value to the ERRINJCR. - \param [in] errinjcr ERRINJCR value to set - */ -__ALWAYS_STATIC_INLINE void __set_ERRINJCR(uint32_t errinjcr) -{ - __ASM volatile("mtcr %0, cr<9, 1>\n" : : "r"(errinjcr)); -} - -/** - \brief Get ERRINJCNT - \details Returns the current value of the ERRINJCNT. - \return ERRINJCNT Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_ERRINJCNT(void) -{ - register uint32_t result; - - __ASM volatile("mfcr %0, cr<10, 1>\n" : "=r"(result)); - return (result); -} - -/** - \brief Set ERRINJCNT - \details Assigns the given value to the ERRINJCNT. - \param [in] errinjcnt ERRINJCNT value to set - */ -__ALWAYS_STATIC_INLINE void __set_ERRINJCNT(uint32_t errinjcnt) -{ - __ASM volatile("mtcr %0, cr<10, 1>\n" : : "r"(errinjcnt)); -} - -/** - \brief Get ITCMCR - \details Returns the content of the ITCMCR Register. - \return ITCMCR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_ITCMCR(void) -{ - uint32_t result; - __ASM volatile("mfcr %0, cr<22, 1>" : "=r"(result)); - return (result); -} - -/** - \brief Set ITCMCR - \details Writes the given value to the ITCMCR Register. - \param [in] itcmcr ITCMCR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_ITCMCR(uint32_t itcmcr) -{ - __ASM volatile("mtcr %0, cr<22, 1>" : : "r"(itcmcr)); -} - -/** - \brief Get DTCMCR - \details Returns the content of the DTCMCR Register. - \return DTCMCR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_DTCMCR(void) -{ - uint32_t result; - __ASM volatile("mfcr %0, cr<23, 1>" : "=r"(result)); - return (result); -} - -/** - \brief Set DTCMCR - \details Writes the given value to the DTCMCR Register. - \param [in] dtcmcr DTCMCR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_DTCMCR(uint32_t dtcmcr) -{ - __ASM volatile("mtcr %0, cr<23, 1>" : : "r"(dtcmcr)); -} - -/** - \brief Get CINDEX - \details Returns the current value of the CINDEX. - \return CINDEX Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_CINDEX(void) -{ - register uint32_t result; - - __ASM volatile("mfcr %0, cr<26, 1>\n" : "=r"(result)); - return (result); -} - -/** - \brief Set CINDEX - \details Assigns the given value to the CINDEX. - \param [in] cindex CINDEX value to set - */ -__ALWAYS_STATIC_INLINE void __set_CINDEX(uint32_t cindex) -{ - __ASM volatile("mtcr %0, cr<26, 1>\n" : : "r"(cindex)); -} - -/** - \brief Get CDATAx - \details Returns the current value of the CDATAx. - \return CDATAx Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_CDATA0(void) -{ - register uint32_t result; - - __ASM volatile("mfcr %0, cr<27, 1>\n" : "=r"(result)); - return (result); -} - -__ALWAYS_STATIC_INLINE uint32_t __get_CDATA1(void) -{ - register uint32_t result; - - __ASM volatile("mfcr %0, cr<28, 1>\n" : "=r"(result)); - return (result); -} - -__ALWAYS_STATIC_INLINE uint32_t __get_CDATA2(void) -{ - register uint32_t result; - - __ASM volatile("mfcr %0, cr<29, 1>\n" : "=r"(result)); - return (result); -} - -/** - \brief Set CDATAx - \details Assigns the given value to the CDATAx. - \param [in] cdata CDATAx value to set - */ -__ALWAYS_STATIC_INLINE void __set_CDATA0(uint32_t cdata) -{ - __ASM volatile("mtcr %0, cr<27, 1>\n" : : "r"(cdata)); -} - -__ALWAYS_STATIC_INLINE void __set_CDATA1(uint32_t cdata) -{ - __ASM volatile("mtcr %0, cr<28, 1>\n" : : "r"(cdata)); -} - -__ALWAYS_STATIC_INLINE void __set_CDATA2(uint32_t cdata) -{ - __ASM volatile("mtcr %0, cr<29, 1>\n" : : "r"(cdata)); -} - -/** - \brief Get CINS - \details Returns the current value of the CINS. - \return CINS Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_CINS(void) -{ - register uint32_t result; - - __ASM volatile("mfcr %0, cr<31, 1>\n" : "=r"(result)); - return (result); -} - -/** - \brief Set CINS - \details Assigns the given value to the CINS. - \param [in] cins CINS value to set - */ -__ALWAYS_STATIC_INLINE void __set_CINS(uint32_t cins) -{ - __ASM volatile("mtcr %0, cr<31, 1>\n" : : "r"(cins)); -} - -/** - \brief Get CAPR - \details Returns the current value of the CAPR. - \return CAPR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_CAPR(void) -{ - register uint32_t result; - -#ifdef __CK610 - __ASM volatile("mfcr %0, cr19\n" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<19, 0>\n" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set CAPR - \details Assigns the given value to the CAPR. - \param [in] capr CAPR value to set - */ -__ALWAYS_STATIC_INLINE void __set_CAPR(uint32_t capr) -{ -#ifdef __CK610 - __ASM volatile("mtcr %0, cr19\n" : : "r"(capr)); -#else - __ASM volatile("mtcr %0, cr<19, 0>\n" : : "r"(capr)); -#endif -} - -/** - \brief Get CAPR1 - \details Returns the current value of the CAPR1. - \return CAPR1 Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_CAPR1(void) -{ - register uint32_t result; - - __ASM volatile("mfcr %0, cr<16, 0>\n" : "=r"(result)); - return (result); -} - -/** - \brief Set CAPR1 - \details Assigns the given value to the CAPR1. - \param [in] capr1 CAPR1 value to set - */ -__ALWAYS_STATIC_INLINE void __set_CAPR1(uint32_t capr1) -{ - __ASM volatile("mtcr %0, cr<16, 0>\n" : : "r"(capr1)); -} - -/** - \brief Set PACR - \details Assigns the given value to the PACR. - - \param [in] pacr PACR value to set - */ -__ALWAYS_STATIC_INLINE void __set_PACR(uint32_t pacr) -{ -#ifdef __CK610 - __ASM volatile("mtcr %0, cr20\n" : : "r"(pacr)); -#else - __ASM volatile("mtcr %0, cr<20, 0>\n" : : "r"(pacr)); -#endif -} - - -/** - \brief Get PACR - \details Returns the current value of PACR. - \return PACR value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_PACR(void) -{ - uint32_t result; - -#ifdef __CK610 - __ASM volatile("mfcr %0, cr20" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<20, 0>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set PRSR - \details Assigns the given value to the PRSR. - - \param [in] prsr PRSR value to set - */ -__ALWAYS_STATIC_INLINE void __set_PRSR(uint32_t prsr) -{ -#ifdef __CK610 - __ASM volatile("mtcr %0, cr21\n" : : "r"(prsr)); -#else - __ASM volatile("mtcr %0, cr<21, 0>\n" : : "r"(prsr)); -#endif -} - -/** - \brief Get PRSR - \details Returns the current value of PRSR. - \return PRSR value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_PRSR(void) -{ - uint32_t result; - -#ifdef __CK610 - __ASM volatile("mfcr %0, cr21" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<21, 0>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set ATTR0 - \details Assigns the given value to the ATTR0. - - \param [in] attr0 ATTR0 value to set - */ -__ALWAYS_STATIC_INLINE void __set_ATTR0(uint32_t attr0) -{ - __ASM volatile("mtcr %0, cr<26, 0>\n" : : "r"(attr0)); -} - -/** - \brief Get ATTR0 - \details Returns the current value of ATTR0. - \return ATTR0 value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_ATTR0(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, cr<26, 0>" : "=r"(result)); - - return (result); -} - -/** - \brief Set ATTR1 - \details Assigns the given value to the ATTR1. - - \param [in] attr0 ATTR1 value to set - */ -__ALWAYS_STATIC_INLINE void __set_ATTR1(uint32_t attr1) -{ - __ASM volatile("mtcr %0, cr<27, 0>\n" : : "r"(attr1)); -} - -/** - \brief Get ATTR1 - \details Returns the current value of ATTR1. - \return ATTR1 value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_ATTR1(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, cr<27, 0>" : "=r"(result)); - - return (result); -} - -/** - \brief Get user sp - \details Returns the current value of user r14. - \return UR14 value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_UR14(void) -{ - uint32_t result; - -#ifdef __CK610 - __ASM volatile("mov %0, sp" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<14, 1>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set UR14 - \details Assigns the given value to the UR14. - \param [in] ur14 UR14 value to set - */ -__ALWAYS_STATIC_INLINE void __set_UR14(uint32_t ur14) -{ -#ifdef __CK610 - __ASM volatile("mov sp, %0" : "=r"(ur14)); -#else - __ASM volatile("mtcr %0, cr<14, 1>\n" : : "r"(ur14)); -#endif -} - -/** - \brief Get CHR Register - \details Returns the content of the CHR Register. - \return CHR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_CHR(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, cr<31, 0>\n" :"=r"(result)); - return (result); -} - -/** - \brief Set CHR - \details Assigns the given value to the CHR. - \param [in] chr CHR value to set - */ -__ALWAYS_STATIC_INLINE void __set_CHR(uint32_t chr) -{ - __ASM volatile("mtcr %0, cr<31, 0>\n" : : "r"(chr)); -} - -/** - \brief Get HINT - \details Returns the content of the HINT Register. - \return HINT Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_HINT(void) -{ - uint32_t result; -#ifdef __CK610 - __ASM volatile("mfcr %0, cr<30, 0>" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<31, 0>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set HINT - \details Writes the given value to the HINT Register. - \param [in] hint HINT Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_HINT(uint32_t hint) -{ -#ifdef __CK610 - __ASM volatile("mtcr %0, cr<30, 0>" : "=r"(hint)); -#else - __ASM volatile("mtcr %0, cr<31, 0>" : : "r"(hint)); -#endif -} - -/** - \brief Get MIR - \details Returns the content of the MIR Register. - \return MIR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_MIR(void) -{ - uint32_t result; -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cprcr %0, cpcr0" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<0, 15>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set MIR - \details Writes the given value to the MIR Register. - \param [in] mir MIR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_MIR(uint32_t mir) -{ -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cpwcr %0, cpcr0" : : "b"(mir)); -#else - __ASM volatile("mtcr %0, cr<0, 15>" : : "r"(mir)); -#endif -} - - -/** - \brief Get MEL0 - \details Returns the content of the MEL0 Register. - \return MEL0 Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_MEL0(void) -{ - uint32_t result; -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cprcr %0, cpcr2" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<2, 15>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set MEL0 - \details Writes the given value to the MEL0 Register. - \param [in] mel0 MEL0 Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_MEL0(uint32_t mel0) -{ -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cpwcr %0, cpcr2" : : "b"(mel0)); -#else - __ASM volatile("mtcr %0, cr<2, 15>" : : "r"(mel0)); -#endif -} - - -/** - \brief Get MEL1 - \details Returns the content of the MEL1 Register. - \return MEL1 Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_MEL1(void) -{ - uint32_t result; -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cprcr %0, cpcr3" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<3, 15>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set MEL1 - \details Writes the given value to the MEL1 Register. - \param [in] mel1 MEL1 Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_MEL1(uint32_t mel1) -{ -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cpwcr %0, cpcr3" : : "b"(mel1)); -#else - __ASM volatile("mtcr %0, cr<3, 15>" : : "r"(mel1)); -#endif -} - - -/** - \brief Get MEH - \details Returns the content of the MEH Register. - \return MEH Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_MEH(void) -{ - uint32_t result; -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cprcr %0, cpcr4" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<4, 15>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set MEH - \details Writes the given value to the MEH Register. - \param [in] meh MEH Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_MEH(uint32_t meh) -{ -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cpwcr %0, cpcr4" : : "b"(meh)); -#else - __ASM volatile("mtcr %0, cr<4, 15>" : : "r"(meh)); -#endif -} - - -/** - \brief Get MPR - \details Returns the content of the MPR Register. - \return MPR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_MPR(void) -{ - uint32_t result; -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cprcr %0, cpcr6" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<6, 15>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set MPR - \details Writes the given value to the MPR Register. - \param [in] mpr MPR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_MPR(uint32_t mpr) -{ -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cpwcr %0, cpcr6" : : "b"(mpr)); -#else - __ASM volatile("mtcr %0, cr<6, 15>" : : "r"(mpr)); -#endif -} - - -/** - \brief Get MCIR - \details Returns the content of the MCIR Register. - \return MCIR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_MCIR(void) -{ - uint32_t result; -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cprcr %0, cpcr8" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<8, 15>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set MCIR - \details Writes the given value to the MCIR Register. - \param [in] mcir MCIR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_MCIR(uint32_t mcir) -{ -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cpwcr %0, cpcr8" : : "b"(mcir)); -#else - __ASM volatile("mtcr %0, cr<8, 15>" : : "r"(mcir)); -#endif -} - - -/** - \brief Get MPGD - \details Returns the content of the MPGD Register. - \return MPGD Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_MPGD(void) -{ - uint32_t result; -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cprcr %0, cpcr29" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<29, 15>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set MPGD - \details Writes the given value to the MPGD Register. - \param [in] mpgd MPGD Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_MPGD(uint32_t mpgd) -{ -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cpwcr %0, cpcr29" : : "b"(mpgd)); -#else - __ASM volatile("mtcr %0, cr<29, 15>" : : "r"(mpgd)); -#endif -} - - -/** - \brief Get MSA0 - \details Returns the content of the MSA0 Register. - \return MSA0 Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_MSA0(void) -{ - uint32_t result; -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cprcr %0, cpcr30" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<30, 15>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set MSA0 - \details Writes the given value to the MSA0 Register. - \param [in] msa0 MSA0 Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_MSA0(uint32_t msa0) -{ -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cpwcr %0, cpcr30" : : "b"(msa0)); -#else - __ASM volatile("mtcr %0, cr<30, 15>" : : "r"(msa0)); -#endif -} - - -/** - \brief Get MSA1 - \details Returns the content of the MSA1 Register. - \return MSA1 Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_MSA1(void) -{ - uint32_t result; - -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cprcr %0, cpcr31" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<31, 15>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set MSA1 - \details Writes the given value to the MSA1 Register. - \param [in] msa1 MSA1 Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_MSA1(uint32_t msa1) -{ -#ifdef __CK610 - __ASM volatile("cpseti 15"); - __ASM volatile("cpwcr %0, cpcr31" : : "b"(msa1)); -#else - __ASM volatile("mtcr %0, cr<31, 15>" : : "r"(msa1)); -#endif -} - - -/** - \brief Enable interrupts and exceptions - \details Enables interrupts and exceptions by setting the IE-bit and EE-bit in the PSR. - Can only be executed in Privileged modes. - */ -__ALWAYS_STATIC_INLINE void __enable_excp_irq(void) -{ - __ASM volatile("psrset ee, ie"); -} - - -/** - \brief Disable interrupts and exceptions - \details Disables interrupts and exceptions by clearing the IE-bit and EE-bit in the PSR. - Can only be executed in Privileged modes. - */ -__ALWAYS_STATIC_INLINE void __disable_excp_irq(void) -{ - __ASM volatile("psrclr ee, ie"); -} - -/** - \brief Get GSR - \details Returns the content of the GSR Register. - \return GSR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_GSR(void) -{ - uint32_t result; - -#ifdef __CK610 - __ASM volatile("mfcr %0, cr12" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<12, 0>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Get GCR - \details Returns the content of the GCR Register. - \return GCR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_GCR(void) -{ - uint32_t result; - -#ifdef __CK610 - __ASM volatile("mfcr %0, cr11" : "=r"(result)); -#else - __ASM volatile("mfcr %0, cr<11, 0>" : "=r"(result)); -#endif - return (result); -} - -/** - \brief Set GCR - \details Writes the given value to the GCR Register. - \param [in] gcr GCR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_GCR(uint32_t gcr) -{ -#ifdef __CK610 - __ASM volatile("mtcr %0, cr11" : : "r"(gcr)); -#else - __ASM volatile("mtcr %0, cr<11, 0>" : : "r"(gcr)); -#endif -} - -/** - \brief Get WSSR - \details Returns the content of the WSSR Register, must be accessed in TEE - \return WSSR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_WSSR(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, cr<0, 3>" : "=r"(result)); - return (result); -} - -/** - \brief Get WRCR - \details Returns the content of the WRCR Register, must be accessed in TEE - \return WRCR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_WRCR(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, cr<1, 3>" : "=r"(result)); - return (result); -} - -/** - \brief Set WRCR - \details Writes the given value to the WRCR Register, must be accessed in TEE - \param [in] wrcr WRCR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_WRCR(uint32_t wrcr) -{ - __ASM volatile("mtcr %0, cr<1, 3>" : : "r"(wrcr)); -} - -/** - \brief Get DCR - \details Returns the content of the DCR Register, must be accessed in TEE - \return DCR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_DCR(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, cr<8, 3>" : "=r"(result)); - return (result); -} - -/** - \brief Set DCR - \details Writes the given value to the DCR Register, must be accessed in TEE - \param [in] dcr DCR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_DCR(uint32_t dcr) -{ - __ASM volatile("mtcr %0, cr<8, 3>" : : "r"(dcr)); -} - -/** - \brief Get PCR - \details Returns the content of the PCR Register, must be accessed in TEE - \return PCR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_PCR(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, cr<9, 3>" : "=r"(result)); - return (result); -} - -/** - \brief Set PCR - \details Writes the given value to the PCR Register, must be accessed in TEE - \param [in] pcr PCR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_PCR(uint32_t pcr) -{ - __ASM volatile("mtcr %0, cr<9, 3>" : : "r"(pcr)); -} - -/** - \brief Get EBR - \details Returns the content of the EBR Register. - \return EBR Register value - */ -__ALWAYS_STATIC_INLINE uint32_t __get_EBR(void) -{ - uint32_t result; - - __ASM volatile("mfcr %0, cr<1, 1>" : "=r"(result)); - return (result); -} - -/** - \brief Set EBR - \details Writes the given value to the EBR Register. - \param [in] ebr EBR Register value to set - */ -__ALWAYS_STATIC_INLINE void __set_EBR(uint32_t ebr) -{ - __ASM volatile("mtcr %0, cr<1, 1>" : : "r"(ebr)); -} - -/*@} end of CSI_Core_RegAccFunctions */ - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CSI_Core_InstructionInterface CSI Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -#define __CSI_GCC_OUT_REG(r) "=r" (r) -#define __CSI_GCC_USE_REG(r) "r" (r) - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -__ALWAYS_STATIC_INLINE void __NOP(void) -{ - __ASM volatile("nop"); -} - - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -__ALWAYS_STATIC_INLINE void __WFI(void) -{ - __ASM volatile("wait"); -} - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one interrupt occurs. - */ -__ALWAYS_STATIC_INLINE void __WAIT(void) -{ - __ASM volatile("wait"); -} - -/** - \brief Doze For Interrupt - \details Doze For Interrupt is a hint instruction that suspends execution until one interrupt occurs. - */ -__ALWAYS_STATIC_INLINE void __DOZE(void) -{ - __ASM volatile("doze"); -} - -/** - \brief Stop For Interrupt - \details Stop For Interrupt is a hint instruction that suspends execution until one interrupt occurs. - */ -__ALWAYS_STATIC_INLINE void __STOP(void) -{ - __ASM volatile("stop"); -} - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -__ALWAYS_STATIC_INLINE void __ISB(void) -{ - __ASM volatile("sync"::: "memory"); -} - - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -__ALWAYS_STATIC_INLINE void __DSB(void) -{ - __ASM volatile("sync"::: "memory"); -} - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -__ALWAYS_STATIC_INLINE void __DMB(void) -{ - __ASM volatile("sync"::: "memory"); -} - -/** - \brief Search from the highest bit that the very first bit which's value is 1. - \param [in] value Value to bit search. - \return if the highest bit' value is 1, return 0, and if lowest bit's value is 1, return 31, otherwise return 32. - */ -#if !defined(__CK610) || !(__CK80X == 1) -__ALWAYS_STATIC_INLINE uint32_t __FF0(uint32_t value) -{ - uint32_t ret; - - __ASM volatile("ff0 %0, %1" : "=r"(ret) : "r"(value)); - return ret; -} -#endif - -/** - \brief Search from the highest bit that the very first bit which's value is 0. - \param [in] value Value to bit search. - \return if the highest bit' value is 0, return 0, and if lowest bit's value is 0, return 31, otherwise return 32. - */ -#if !(__CK80X == 1) -__ALWAYS_STATIC_INLINE uint32_t __FF1(uint32_t value) -{ - uint32_t ret; -#if !defined (__CK610) - __ASM volatile("ff1 %0, %1" : "=r"(ret) : "r"(value)); -#else - ret = value; - __ASM volatile("ff1 %0" : "=r"(ret):); -#endif - return ret; -} -#endif - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in integer value. - \param [in] value Value to reverse - \return Reversed value - */ -__ALWAYS_STATIC_INLINE uint32_t __REV(uint32_t value) -{ - return __builtin_bswap32(value); -} - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in two unsigned short values. - \param [in] value Value to reverse - \return Reversed value - */ -__ALWAYS_STATIC_INLINE uint32_t __REV16(uint32_t value) -{ - uint32_t result; -#if (__CK80X >= 2) - __ASM volatile("revh %0, %1" : __CSI_GCC_OUT_REG(result) : __CSI_GCC_USE_REG(value)); -#else - result = ((value & 0xFF000000) >> 8) | ((value & 0x00FF0000) << 8) | - ((value & 0x0000FF00) >> 8) | ((value & 0x000000FF) << 8); -#endif - return (result); -} - - -/** - \brief Reverse byte order in signed short value - \details Reverses the byte order in a signed short value with sign extension to integer. - \param [in] value Value to reverse - \return Reversed value - */ -__ALWAYS_STATIC_INLINE int32_t __REVSH(int32_t value) -{ - return (short)(((value & 0xFF00) >> 8) | ((value & 0x00FF) << 8)); -} - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -__ALWAYS_STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - */ -__ALWAYS_STATIC_INLINE void __BKPT(void) -{ - __ASM volatile("bkpt"); -} - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -__ALWAYS_STATIC_INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - -#if (__CK80X >= 0x03U) - __ASM volatile("brev %0, %1" : "=r"(result) : "r"(value)); -#else - int32_t s = 4 /*sizeof(v)*/ * 8 - 1; /* extra shift needed at end */ - - result = value; /* r will be reversed bits of v; first get LSB of v */ - - for (value >>= 1U; value; value >>= 1U) { - result <<= 1U; - result |= value & 1U; - s--; - } - - result <<= s; /* shift when v's highest bits are zero */ -#endif - return (result); -} - - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __builtin_clz -/** - \details This function saturates a signed value. - \param [in] x Value to be saturated - \param [in] y Bit position to saturate to [1..32] - \return Saturated value. - */ -__ALWAYS_STATIC_INLINE int32_t __SSAT(int32_t x, uint32_t y) -{ - int32_t posMax, negMin; - uint32_t i; - - posMax = 1; - - for (i = 0; i < (y - 1); i++) { - posMax = posMax * 2; - } - - if (x > 0) { - posMax = (posMax - 1); - - if (x > posMax) { - x = posMax; - } - -// x &= (posMax * 2 + 1); - } else { - negMin = -posMax; - - if (x < negMin) { - x = negMin; - } - -// x &= (posMax * 2 - 1); - } - - return (x); -} - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__ALWAYS_STATIC_INLINE uint32_t __USAT(uint32_t value, uint32_t sat) -{ - uint32_t result; - - if ((((0xFFFFFFFF >> sat) << sat) & value) != 0) { - result = 0xFFFFFFFF >> (32 - sat); - } else { - result = value; - } - - return (result); -} - -/** - \brief Unsigned Saturate for internal use - \details Saturates an unsigned value, should not call directly. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__ALWAYS_STATIC_INLINE uint32_t __IUSAT(uint32_t value, uint32_t sat) -{ - uint32_t result; - - if (value & 0x80000000) { /* only overflow set bit-31 */ - result = 0; - } else if ((((0xFFFFFFFF >> sat) << sat) & value) != 0) { - result = 0xFFFFFFFF >> (32 - sat); - } else { - result = value; - } - - return (result); -} - -/** - \brief Rotate Right with Extend - \details This function moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \note carry input will always 0. - \param [in] op1 Value to rotate - \return Rotated value - */ -__ALWAYS_STATIC_INLINE uint32_t __RRX(uint32_t op1) -{ -#if (__CK80X >= 2) - uint32_t res = 0; - __ASM volatile("bgeni t0, 31\n\t" - "lsri %0, 1\n\t" - "movt %1, t0\n\t" - "or %1, %1, %0\n\t" - : "=r"(op1), "=r"(res): "0"(op1), "1"(res): "t0"); - return res; -#else - uint32_t res = 0; - __ASM volatile("movi r7, 0\n\t" - "bseti r7, 31\n\t" - "lsri %0, 1\n\t" - "bf 1f\n\t" - "mov %1, r7\n\t" - "1:\n\t" - "or %1, %1, %0\n\t" - : "=r"(op1), "=r"(res): "0"(op1), "1"(res): "r7"); - return res; -#endif -} - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] addr Pointer to location - \return value of type uint8_t at (*ptr) - */ -__ALWAYS_STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *addr) -{ - uint32_t result; -//#warning "__LDRBT" - __ASM volatile("ldb %0, (%1, 0)" : "=r"(result) : "r"(addr)); - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] addr Pointer to location - \return value of type uint16_t at (*ptr) - */ -__ALWAYS_STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *addr) -{ - uint32_t result; - -//#warning "__LDRHT" - __ASM volatile("ldh %0, (%1, 0)" : "=r"(result) : "r"(addr)); - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] addr Pointer to location - \return value of type uint32_t at (*ptr) - */ -__ALWAYS_STATIC_INLINE uint32_t __LDRT(volatile uint32_t *addr) -{ - uint32_t result; - -//#warning "__LDRT" - __ASM volatile("ldw %0, (%1, 0)" : "=r"(result) : "r"(addr)); - return (result); -} - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] addr Pointer to location - */ -__ALWAYS_STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *addr) -{ -//#warning "__STRBT" - __ASM volatile("stb %1, (%0, 0)" :: "r"(addr), "r"((uint32_t)value) : "memory"); -} - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] addr Pointer to location - */ -__ALWAYS_STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *addr) -{ -//#warning "__STRHT" - __ASM volatile("sth %1, (%0, 0)" :: "r"(addr), "r"((uint32_t)value) : "memory"); -} - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] addr Pointer to location - */ -__ALWAYS_STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *addr) -{ -//#warning "__STRT" - __ASM volatile("stw %1, (%0, 0)" :: "r"(addr), "r"(value) : "memory"); -} - -/*@}*/ /* end of group CSI_Core_InstructionInterface */ - - -/* ########################## FPU functions #################################### */ -/** - \ingroup CSI_Core_FunctionInterface - \defgroup CSI_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ - */ - -/** - \brief get FPU type - \details returns the FPU type, always 0. - \returns - - \b 0: No FPU - - \b 1: Single precision FPU - - \b 2: Double + Single precision FPU - */ -__ALWAYS_STATIC_INLINE uint32_t __get_FPUType(void) -{ -//FIXME: - return 0; -} - -/*@} end of CSI_Core_FpuFunctions */ - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CSI_SIMD_intrinsics CSI SIMD Intrinsics - Access to dedicated SIMD instructions \n - Single Instruction Multiple Data (SIMD) extensions are provided to simplify development of application software. SIMD extensions increase the processing capability without materially increasing the power consumption. The SIMD extensions are completely transparent to the operating system (OS), allowing existing OS ports to be used. - - @{ -*/ - -/** - \brief Halfword packing instruction. Combines bits[15:0] of val1 with bits[31:16] - of val2 levitated with the val3. - \details Combine a halfword from one register with a halfword from another register. - The second argument can be left-shifted before extraction of the halfword. - \param [in] val1 first 16-bit operands - \param [in] val2 second 16-bit operands - \param [in] val3 value for left-shifting val2. Value range [0..31]. - \return the combination of halfwords. - \remark - res[15:0] = val1[15:0] \n - res[31:16] = val2[31:16] << val3 - */ -__ALWAYS_STATIC_INLINE uint32_t __PKHBT(uint32_t val1, uint32_t val2, uint32_t val3) -{ - return ((((int32_t)(val1) << 0) & (int32_t)0x0000FFFF) | (((int32_t)(val2) << val3) & (int32_t)0xFFFF0000)); -} - -/** - \brief Halfword packing instruction. Combines bits[31:16] of val1 with bits[15:0] - of val2 right-shifted with the val3. - \details Combine a halfword from one register with a halfword from another register. - The second argument can be right-shifted before extraction of the halfword. - \param [in] val1 first 16-bit operands - \param [in] val2 second 16-bit operands - \param [in] val3 value for right-shifting val2. Value range [1..32]. - \return the combination of halfwords. - \remark - res[15:0] = val2[15:0] >> val3 \n - res[31:16] = val1[31:16] - */ -__ALWAYS_STATIC_INLINE uint32_t __PKHTB(uint32_t val1, uint32_t val2, uint32_t val3) -{ - return ((((int32_t)(val1) << 0) & (int32_t)0xFFFF0000) | (((int32_t)(val2) >> val3) & (int32_t)0x0000FFFF)); -} - -/** - \brief Dual 16-bit signed saturate. - \details This function saturates a signed value. - \param [in] x two signed 16-bit values to be saturated. - \param [in] y bit position for saturation, an integral constant expression in the range 1 to 16. - \return the sum of the absolute differences of the following bytes, added to the accumulation value:\n - the signed saturation of the low halfword in val1, saturated to the bit position specified in - val2 and returned in the low halfword of the return value.\n - the signed saturation of the high halfword in val1, saturated to the bit position specified in - val2 and returned in the high halfword of the return value. - */ -__ALWAYS_STATIC_INLINE uint32_t __SSAT16(int32_t x, const uint32_t y) -{ - int32_t r = 0, s = 0; - - r = __SSAT((((int32_t)x << 16) >> 16), y) & (int32_t)0x0000FFFF; - s = __SSAT((((int32_t)x) >> 16), y) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - -/** - \brief Dual 16-bit unsigned saturate. - \details This function enables you to saturate two signed 16-bit values to a selected unsigned range. - \param [in] x two signed 16-bit values to be saturated. - \param [in] y bit position for saturation, an integral constant expression in the range 1 to 16. - \return the saturation of the two signed 16-bit values, as non-negative values: - the saturation of the low halfword in val1, saturated to the bit position specified in - val2 and returned in the low halfword of the return value.\n - the saturation of the high halfword in val1, saturated to the bit position specified in - val2 and returned in the high halfword of the return value. - */ -__ALWAYS_STATIC_INLINE uint32_t __USAT16(uint32_t x, const uint32_t y) -{ - int32_t r = 0, s = 0; - - r = __IUSAT(((x << 16) >> 16), y) & 0x0000FFFF; - s = __IUSAT(((x) >> 16), y) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - -/** - \brief Quad 8-bit saturating addition. - \details This function enables you to perform four 8-bit integer additions, - saturating the results to the 8-bit signed integer range -2^7 <= x <= 2^7 - 1. - \param [in] x first four 8-bit summands. - \param [in] y second four 8-bit summands. - \return the saturated addition of the first byte of each operand in the first byte of the return value.\n - the saturated addition of the second byte of each operand in the second byte of the return value.\n - the saturated addition of the third byte of each operand in the third byte of the return value.\n - the saturated addition of the fourth byte of each operand in the fourth byte of the return value.\n - The returned results are saturated to the 8-bit signed integer range -2^7 <= x <= 2^7 - 1. - \remark - res[7:0] = val1[7:0] + val2[7:0] \n - res[15:8] = val1[15:8] + val2[15:8] \n - res[23:16] = val1[23:16] + val2[23:16] \n - res[31:24] = val1[31:24] + val2[31:24] - */ -__ALWAYS_STATIC_INLINE uint32_t __QADD8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = __SSAT(((((int32_t)x << 24) >> 24) + (((int32_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; - s = __SSAT(((((int32_t)x << 16) >> 24) + (((int32_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; - t = __SSAT(((((int32_t)x << 8) >> 24) + (((int32_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; - u = __SSAT(((((int32_t)x) >> 24) + (((int32_t)y) >> 24)), 8) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r))); -} - -/** - \brief Quad 8-bit unsigned saturating addition. - \details This function enables you to perform four unsigned 8-bit integer additions, - saturating the results to the 8-bit unsigned integer range 0 < x < 2^8 - 1. - \param [in] x first four 8-bit summands. - \param [in] y second four 8-bit summands. - \return the saturated addition of the first byte of each operand in the first byte of the return value.\n - the saturated addition of the second byte of each operand in the second byte of the return value.\n - the saturated addition of the third byte of each operand in the third byte of the return value.\n - the saturated addition of the fourth byte of each operand in the fourth byte of the return value.\n - The returned results are saturated to the 8-bit signed integer range 0 <= x <= 2^8 - 1. - \remark - res[7:0] = val1[7:0] + val2[7:0] \n - res[15:8] = val1[15:8] + val2[15:8] \n - res[23:16] = val1[23:16] + val2[23:16] \n - res[31:24] = val1[31:24] + val2[31:24] - */ -__ALWAYS_STATIC_INLINE uint32_t __UQADD8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = __IUSAT((((x << 24) >> 24) + ((y << 24) >> 24)), 8) & 0x000000FF; - s = __IUSAT((((x << 16) >> 24) + ((y << 16) >> 24)), 8) & 0x000000FF; - t = __IUSAT((((x << 8) >> 24) + ((y << 8) >> 24)), 8) & 0x000000FF; - u = __IUSAT((((x) >> 24) + ((y) >> 24)), 8) & 0x000000FF; - - return ((u << 24) | (t << 16) | (s << 8) | (r)); -} - -/** - \brief Quad 8-bit signed addition. - \details This function performs four 8-bit signed integer additions. - \param [in] x first four 8-bit summands. - \param [in] y second four 8-bit summands. - \return the addition of the first bytes from each operand, in the first byte of the return value.\n - the addition of the second bytes of each operand, in the second byte of the return value.\n - the addition of the third bytes of each operand, in the third byte of the return value.\n - the addition of the fourth bytes of each operand, in the fourth byte of the return value. - \remark - res[7:0] = val1[7:0] + val2[7:0] \n - res[15:8] = val1[15:8] + val2[15:8] \n - res[23:16] = val1[23:16] + val2[23:16] \n - res[31:24] = val1[31:24] + val2[31:24] - */ -__ALWAYS_STATIC_INLINE uint32_t __SADD8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = ((((int32_t)x << 24) >> 24) + (((int32_t)y << 24) >> 24)) & (int32_t)0x000000FF; - s = ((((int32_t)x << 16) >> 24) + (((int32_t)y << 16) >> 24)) & (int32_t)0x000000FF; - t = ((((int32_t)x << 8) >> 24) + (((int32_t)y << 8) >> 24)) & (int32_t)0x000000FF; - u = ((((int32_t)x) >> 24) + (((int32_t)y) >> 24)) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r))); -} - -/** - \brief Quad 8-bit unsigned addition. - \details This function performs four unsigned 8-bit integer additions. - \param [in] x first four 8-bit summands. - \param [in] y second four 8-bit summands. - \return the addition of the first bytes from each operand, in the first byte of the return value.\n - the addition of the second bytes of each operand, in the second byte of the return value.\n - the addition of the third bytes of each operand, in the third byte of the return value.\n - the addition of the fourth bytes of each operand, in the fourth byte of the return value. - \remark - res[7:0] = val1[7:0] + val2[7:0] \n - res[15:8] = val1[15:8] + val2[15:8] \n - res[23:16] = val1[23:16] + val2[23:16] \n - res[31:24] = val1[31:24] + val2[31:24] - */ -__ALWAYS_STATIC_INLINE uint32_t __UADD8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = (((x << 24) >> 24) + ((y << 24) >> 24)) & 0x000000FF; - s = (((x << 16) >> 24) + ((y << 16) >> 24)) & 0x000000FF; - t = (((x << 8) >> 24) + ((y << 8) >> 24)) & 0x000000FF; - u = (((x) >> 24) + ((y) >> 24)) & 0x000000FF; - - return ((u << 24) | (t << 16) | (s << 8) | (r)); -} - -/** - \brief Quad 8-bit saturating subtract. - \details This function enables you to perform four 8-bit integer subtractions, - saturating the results to the 8-bit signed integer range -2^7 <= x <= 2^7 - 1. - \param [in] x first four 8-bit summands. - \param [in] y second four 8-bit summands. - \return the subtraction of the first byte of each operand in the first byte of the return value.\n - the subtraction of the second byte of each operand in the second byte of the return value.\n - the subtraction of the third byte of each operand in the third byte of the return value.\n - the subtraction of the fourth byte of each operand in the fourth byte of the return value.\n - The returned results are saturated to the 8-bit signed integer range -2^7 <= x <= 2^7 - 1. - \remark - res[7:0] = val1[7:0] - val2[7:0] \n - res[15:8] = val1[15:8] - val2[15:8] \n - res[23:16] = val1[23:16] - val2[23:16] \n - res[31:24] = val1[31:24] - val2[31:24] - */ -__ALWAYS_STATIC_INLINE uint32_t __QSUB8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = __SSAT(((((int32_t)x << 24) >> 24) - (((int32_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; - s = __SSAT(((((int32_t)x << 16) >> 24) - (((int32_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; - t = __SSAT(((((int32_t)x << 8) >> 24) - (((int32_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; - u = __SSAT(((((int32_t)x) >> 24) - (((int32_t)y) >> 24)), 8) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r))); -} - -/** - \brief Quad 8-bit unsigned saturating subtraction. - \details This function enables you to perform four unsigned 8-bit integer subtractions, - saturating the results to the 8-bit unsigned integer range 0 < x < 2^8 - 1. - \param [in] x first four 8-bit summands. - \param [in] y second four 8-bit summands. - \return the subtraction of the first byte of each operand in the first byte of the return value.\n - the subtraction of the second byte of each operand in the second byte of the return value.\n - the subtraction of the third byte of each operand in the third byte of the return value.\n - the subtraction of the fourth byte of each operand in the fourth byte of the return value.\n - The returned results are saturated to the 8-bit unsigned integer range 0 <= x <= 2^8 - 1. - \remark - res[7:0] = val1[7:0] - val2[7:0] \n - res[15:8] = val1[15:8] - val2[15:8] \n - res[23:16] = val1[23:16] - val2[23:16] \n - res[31:24] = val1[31:24] - val2[31:24] - */ -__ALWAYS_STATIC_INLINE uint32_t __UQSUB8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = __IUSAT((((x << 24) >> 24) - ((y << 24) >> 24)), 8) & 0x000000FF; - s = __IUSAT((((x << 16) >> 24) - ((y << 16) >> 24)), 8) & 0x000000FF; - t = __IUSAT((((x << 8) >> 24) - ((y << 8) >> 24)), 8) & 0x000000FF; - u = __IUSAT((((x) >> 24) - ((y) >> 24)), 8) & 0x000000FF; - - return ((u << 24) | (t << 16) | (s << 8) | (r)); -} - -/** - \brief Quad 8-bit signed subtraction. - \details This function enables you to perform four 8-bit signed integer subtractions. - \param [in] x first four 8-bit operands of each subtraction. - \param [in] y second four 8-bit operands of each subtraction. - \return the subtraction of the first bytes from each operand, in the first byte of the return value.\n - the subtraction of the second bytes of each operand, in the second byte of the return value.\n - the subtraction of the third bytes of each operand, in the third byte of the return value.\n - the subtraction of the fourth bytes of each operand, in the fourth byte of the return value. - \remark - res[7:0] = val1[7:0] - val2[7:0] \n - res[15:8] = val1[15:8] - val2[15:8] \n - res[23:16] = val1[23:16] - val2[23:16] \n - res[31:24] = val1[31:24] - val2[31:24] - */ -__ALWAYS_STATIC_INLINE uint32_t __SSUB8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = ((((int32_t)x << 24) >> 24) - (((int32_t)y << 24) >> 24)) & (int32_t)0x000000FF; - s = ((((int32_t)x << 16) >> 24) - (((int32_t)y << 16) >> 24)) & (int32_t)0x000000FF; - t = ((((int32_t)x << 8) >> 24) - (((int32_t)y << 8) >> 24)) & (int32_t)0x000000FF; - u = ((((int32_t)x) >> 24) - (((int32_t)y) >> 24)) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r))); -} - -/** - \brief Quad 8-bit unsigned subtract. - \details This function enables you to perform four 8-bit unsigned integer subtractions. - \param [in] x first four 8-bit operands of each subtraction. - \param [in] y second four 8-bit operands of each subtraction. - \return the subtraction of the first bytes from each operand, in the first byte of the return value.\n - the subtraction of the second bytes of each operand, in the second byte of the return value.\n - the subtraction of the third bytes of each operand, in the third byte of the return value.\n - the subtraction of the fourth bytes of each operand, in the fourth byte of the return value. - \remark - res[7:0] = val1[7:0] - val2[7:0] \n - res[15:8] = val1[15:8] - val2[15:8] \n - res[23:16] = val1[23:16] - val2[23:16] \n - res[31:24] = val1[31:24] - val2[31:24] - */ -__ALWAYS_STATIC_INLINE uint32_t __USUB8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = (((x << 24) >> 24) - ((y << 24) >> 24)) & 0x000000FF; - s = (((x << 16) >> 24) - ((y << 16) >> 24)) & 0x000000FF; - t = (((x << 8) >> 24) - ((y << 8) >> 24)) & 0x000000FF; - u = (((x) >> 24) - ((y) >> 24)) & 0x000000FF; - - return ((u << 24) | (t << 16) | (s << 8) | (r)); -} - -/** - \brief Unsigned sum of quad 8-bit unsigned absolute difference. - \details This function enables you to perform four unsigned 8-bit subtractions, and add the absolute values - of the differences together, returning the result as a single unsigned integer. - \param [in] x first four 8-bit operands of each subtraction. - \param [in] y second four 8-bit operands of each subtraction. - \return the subtraction of the first bytes from each operand, in the first byte of the return value.\n - the subtraction of the second bytes of each operand, in the second byte of the return value.\n - the subtraction of the third bytes of each operand, in the third byte of the return value.\n - the subtraction of the fourth bytes of each operand, in the fourth byte of the return value.\n - The sum is returned as a single unsigned integer. - \remark - absdiff1 = val1[7:0] - val2[7:0] \n - absdiff2 = val1[15:8] - val2[15:8] \n - absdiff3 = val1[23:16] - val2[23:16] \n - absdiff4 = val1[31:24] - val2[31:24] \n - res[31:0] = absdiff1 + absdiff2 + absdiff3 + absdiff4 - */ -__ALWAYS_STATIC_INLINE uint32_t __USAD8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = (((x << 24) >> 24) - ((y << 24) >> 24)) & 0x000000FF; - s = (((x << 16) >> 24) - ((y << 16) >> 24)) & 0x000000FF; - t = (((x << 8) >> 24) - ((y << 8) >> 24)) & 0x000000FF; - u = (((x) >> 24) - ((y) >> 24)) & 0x000000FF; - - return (u + t + s + r); -} - -/** - \brief Unsigned sum of quad 8-bit unsigned absolute difference with 32-bit accumulate. - \details This function enables you to perform four unsigned 8-bit subtractions, and add the absolute values - of the differences to a 32-bit accumulate operand. - \param [in] x first four 8-bit operands of each subtraction. - \param [in] y second four 8-bit operands of each subtraction. - \param [in] sum accumulation value. - \return the sum of the absolute differences of the following bytes, added to the accumulation value: - the subtraction of the first bytes from each operand, in the first byte of the return value.\n - the subtraction of the second bytes of each operand, in the second byte of the return value.\n - the subtraction of the third bytes of each operand, in the third byte of the return value.\n - the subtraction of the fourth bytes of each operand, in the fourth byte of the return value. - \remark - absdiff1 = val1[7:0] - val2[7:0] \n - absdiff2 = val1[15:8] - val2[15:8] \n - absdiff3 = val1[23:16] - val2[23:16] \n - absdiff4 = val1[31:24] - val2[31:24] \n - sum = absdiff1 + absdiff2 + absdiff3 + absdiff4 \n - res[31:0] = sum[31:0] + val3[31:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __USADA8(uint32_t x, uint32_t y, uint32_t sum) -{ - int32_t r, s, t, u; - -#ifdef __cplusplus - r = (abs((long long)((x << 24) >> 24) - ((y << 24) >> 24))) & 0x000000FF; - s = (abs((long long)((x << 16) >> 24) - ((y << 16) >> 24))) & 0x000000FF; - t = (abs((long long)((x << 8) >> 24) - ((y << 8) >> 24))) & 0x000000FF; - u = (abs((long long)((x) >> 24) - ((y) >> 24))) & 0x000000FF; -#else - r = (abs(((x << 24) >> 24) - ((y << 24) >> 24))) & 0x000000FF; - s = (abs(((x << 16) >> 24) - ((y << 16) >> 24))) & 0x000000FF; - t = (abs(((x << 8) >> 24) - ((y << 8) >> 24))) & 0x000000FF; - u = (abs(((x) >> 24) - ((y) >> 24))) & 0x000000FF; -#endif - return (u + t + s + r + sum); -} - -/** - \brief Dual 16-bit saturating addition. - \details This function enables you to perform two 16-bit integer arithmetic additions in parallel, - saturating the results to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1. - \param [in] x first two 16-bit summands. - \param [in] y second two 16-bit summands. - \return the saturated addition of the low halfwords, in the low halfword of the return value.\n - the saturated addition of the high halfwords, in the high halfword of the return value.\n - The returned results are saturated to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1. - \remark - res[15:0] = val1[15:0] + val2[15:0] \n - res[31:16] = val1[31:16] + val2[31:16] - */ -__ALWAYS_STATIC_INLINE uint32_t __QADD16(uint32_t x, uint32_t y) -{ - int32_t r = 0, s = 0; - - r = __SSAT(((((int32_t)x << 16) >> 16) + (((int32_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((int32_t)x) >> 16) + (((int32_t)y) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - -/** - \brief Dual 16-bit unsigned saturating addition. - \details This function enables you to perform two unsigned 16-bit integer additions, saturating - the results to the 16-bit unsigned integer range 0 < x < 2^16 - 1. - \param [in] x first two 16-bit summands. - \param [in] y second two 16-bit summands. - \return the saturated addition of the low halfwords, in the low halfword of the return value.\n - the saturated addition of the high halfwords, in the high halfword of the return value.\n - The results are saturated to the 16-bit unsigned integer range 0 < x < 2^16 - 1. - \remark - res[15:0] = val1[15:0] + val2[15:0] \n - res[31:16] = val1[31:16] + val2[31:16] - */ -__ALWAYS_STATIC_INLINE uint32_t __UQADD16(uint32_t x, uint32_t y) -{ - int32_t r = 0, s = 0; - - r = __IUSAT((((x << 16) >> 16) + ((y << 16) >> 16)), 16) & 0x0000FFFF; - s = __IUSAT((((x) >> 16) + ((y) >> 16)), 16) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - -/** - \brief Dual 16-bit signed addition. - \details This function enables you to perform two 16-bit signed integer additions. - \param [in] x first two 16-bit summands. - \param [in] y second two 16-bit summands. - \return the addition of the low halfwords in the low halfword of the return value.\n - the addition of the high halfwords in the high halfword of the return value. - \remark - res[15:0] = val1[15:0] + val2[15:0] \n - res[31:16] = val1[31:16] + val2[31:16] - */ -__ALWAYS_STATIC_INLINE uint32_t __SADD16(uint32_t x, uint32_t y) -{ - int32_t r = 0, s = 0; - - r = ((((int32_t)x << 16) >> 16) + (((int32_t)y << 16) >> 16)) & (int32_t)0x0000FFFF; - s = ((((int32_t)x) >> 16) + (((int32_t)y) >> 16)) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - -/** - \brief Dual 16-bit unsigned addition - \details This function enables you to perform two 16-bit unsigned integer additions. - \param [in] x first two 16-bit summands for each addition. - \param [in] y second two 16-bit summands for each addition. - \return the addition of the low halfwords in the low halfword of the return value.\n - the addition of the high halfwords in the high halfword of the return value. - \remark - res[15:0] = val1[15:0] + val2[15:0] \n - res[31:16] = val1[31:16] + val2[31:16] - */ -__ALWAYS_STATIC_INLINE uint32_t __UADD16(uint32_t x, uint32_t y) -{ - int32_t r = 0, s = 0; - - r = (((x << 16) >> 16) + ((y << 16) >> 16)) & 0x0000FFFF; - s = (((x) >> 16) + ((y) >> 16)) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - - -/** - \brief Dual 16-bit signed addition with halved results. - \details This function enables you to perform two signed 16-bit integer additions, halving the results. - \param [in] x first two 16-bit summands. - \param [in] y second two 16-bit summands. - \return the halved addition of the low halfwords, in the low halfword of the return value.\n - the halved addition of the high halfwords, in the high halfword of the return value. - \remark - res[15:0] = (val1[15:0] + val2[15:0]) >> 1 \n - res[31:16] = (val1[31:16] + val2[31:16]) >> 1 - */ -__ALWAYS_STATIC_INLINE uint32_t __SHADD16(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = (((((int32_t)x << 16) >> 16) + (((int32_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((int32_t)x) >> 16) + (((int32_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - -/** - \brief Dual 16-bit unsigned addition with halved results. - \details This function enables you to perform two unsigned 16-bit integer additions, halving the results. - \param [in] x first two 16-bit summands. - \param [in] y second two 16-bit summands. - \return the halved addition of the low halfwords, in the low halfword of the return value.\n - the halved addition of the high halfwords, in the high halfword of the return value. - \remark - res[15:0] = (val1[15:0] + val2[15:0]) >> 1 \n - res[31:16] = (val1[31:16] + val2[31:16]) >> 1 - */ -__ALWAYS_STATIC_INLINE uint32_t __UHADD16(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = ((((x << 16) >> 16) + ((y << 16) >> 16)) >> 1) & 0x0000FFFF; - s = ((((x) >> 16) + ((y) >> 16)) >> 1) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - -/** - \brief Quad 8-bit signed addition with halved results. - \details This function enables you to perform four signed 8-bit integer additions, halving the results. - \param [in] x first four 8-bit summands. - \param [in] y second four 8-bit summands. - \return the halved addition of the first bytes from each operand, in the first byte of the return value.\n - the halved addition of the second bytes from each operand, in the second byte of the return value.\n - the halved addition of the third bytes from each operand, in the third byte of the return value.\n - the halved addition of the fourth bytes from each operand, in the fourth byte of the return value. - \remark - res[7:0] = (val1[7:0] + val2[7:0] ) >> 1 \n - res[15:8] = (val1[15:8] + val2[15:8] ) >> 1 \n - res[23:16] = (val1[23:16] + val2[23:16]) >> 1 \n - res[31:24] = (val1[31:24] + val2[31:24]) >> 1 - */ -__ALWAYS_STATIC_INLINE uint32_t __SHADD8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = (((((int32_t)x << 24) >> 24) + (((int32_t)y << 24) >> 24)) >> 1) & (int32_t)0x000000FF; - s = (((((int32_t)x << 16) >> 24) + (((int32_t)y << 16) >> 24)) >> 1) & (int32_t)0x000000FF; - t = (((((int32_t)x << 8) >> 24) + (((int32_t)y << 8) >> 24)) >> 1) & (int32_t)0x000000FF; - u = (((((int32_t)x) >> 24) + (((int32_t)y) >> 24)) >> 1) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r))); -} - -/** - \brief Quad 8-bit unsigned addition with halved results. - \details This function enables you to perform four unsigned 8-bit integer additions, halving the results. - \param [in] x first four 8-bit summands. - \param [in] y second four 8-bit summands. - \return the halved addition of the first bytes from each operand, in the first byte of the return value.\n - the halved addition of the second bytes from each operand, in the second byte of the return value.\n - the halved addition of the third bytes from each operand, in the third byte of the return value.\n - the halved addition of the fourth bytes from each operand, in the fourth byte of the return value. - \remark - res[7:0] = (val1[7:0] + val2[7:0] ) >> 1 \n - res[15:8] = (val1[15:8] + val2[15:8] ) >> 1 \n - res[23:16] = (val1[23:16] + val2[23:16]) >> 1 \n - res[31:24] = (val1[31:24] + val2[31:24]) >> 1 - */ -__ALWAYS_STATIC_INLINE uint32_t __UHADD8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = ((((x << 24) >> 24) + ((y << 24) >> 24)) >> 1) & 0x000000FF; - s = ((((x << 16) >> 24) + ((y << 16) >> 24)) >> 1) & 0x000000FF; - t = ((((x << 8) >> 24) + ((y << 8) >> 24)) >> 1) & 0x000000FF; - u = ((((x) >> 24) + ((y) >> 24)) >> 1) & 0x000000FF; - - return ((u << 24) | (t << 16) | (s << 8) | (r)); -} - -/** - \brief Dual 16-bit saturating subtract. - \details This function enables you to perform two 16-bit integer subtractions in parallel, - saturating the results to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1. - \param [in] x first two 16-bit summands. - \param [in] y second two 16-bit summands. - \return the saturated subtraction of the low halfwords, in the low halfword of the return value.\n - the saturated subtraction of the high halfwords, in the high halfword of the return value.\n - The returned results are saturated to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1. - \remark - res[15:0] = val1[15:0] - val2[15:0] \n - res[31:16] = val1[31:16] - val2[31:16] - */ -__ALWAYS_STATIC_INLINE uint32_t __QSUB16(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = __SSAT(((((int32_t)x << 16) >> 16) - (((int32_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((int32_t)x) >> 16) - (((int32_t)y) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - -/** - \brief Dual 16-bit unsigned saturating subtraction. - \details This function enables you to perform two unsigned 16-bit integer subtractions, - saturating the results to the 16-bit unsigned integer range 0 < x < 2^16 - 1. - \param [in] x first two 16-bit operands for each subtraction. - \param [in] y second two 16-bit operands for each subtraction. - \return the saturated subtraction of the low halfwords, in the low halfword of the return value.\n - the saturated subtraction of the high halfwords, in the high halfword of the return value.\n - The returned results are saturated to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1. - \remark - res[15:0] = val1[15:0] - val2[15:0] \n - res[31:16] = val1[31:16] - val2[31:16] - */ -__ALWAYS_STATIC_INLINE uint32_t __UQSUB16(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = __IUSAT((((x << 16) >> 16) - ((y << 16) >> 16)), 16) & 0x0000FFFF; - s = __IUSAT((((x) >> 16) - ((y) >> 16)), 16) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - -/** - \brief Dual 16-bit signed subtraction. - \details This function enables you to perform two 16-bit signed integer subtractions. - \param [in] x first two 16-bit operands of each subtraction. - \param [in] y second two 16-bit operands of each subtraction. - \return the subtraction of the low halfword in the second operand from the low - halfword in the first operand, in the low halfword of the return value. \n - the subtraction of the high halfword in the second operand from the high - halfword in the first operand, in the high halfword of the return value. - \remark - res[15:0] = val1[15:0] - val2[15:0] \n - res[31:16] = val1[31:16] - val2[31:16] - */ -__ALWAYS_STATIC_INLINE uint32_t __SSUB16(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = ((((int32_t)x << 16) >> 16) - (((int32_t)y << 16) >> 16)) & (int32_t)0x0000FFFF; - s = ((((int32_t)x) >> 16) - (((int32_t)y) >> 16)) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - -/** - \brief Dual 16-bit unsigned subtract. - \details This function enables you to perform two 16-bit unsigned integer subtractions. - \param [in] x first two 16-bit operands of each subtraction. - \param [in] y second two 16-bit operands of each subtraction. - \return the subtraction of the low halfword in the second operand from the low - halfword in the first operand, in the low halfword of the return value. \n - the subtraction of the high halfword in the second operand from the high - halfword in the first operand, in the high halfword of the return value. - \remark - res[15:0] = val1[15:0] - val2[15:0] \n - res[31:16] = val1[31:16] - val2[31:16] - */ -__ALWAYS_STATIC_INLINE uint32_t __USUB16(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = (((x << 16) >> 16) - ((y << 16) >> 16)) & 0x0000FFFF; - s = (((x) >> 16) - ((y) >> 16)) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - -/** - \brief Dual 16-bit signed subtraction with halved results. - \details This function enables you to perform two signed 16-bit integer subtractions, halving the results. - \param [in] x first two 16-bit summands. - \param [in] y second two 16-bit summands. - \return the halved subtraction of the low halfwords, in the low halfword of the return value.\n - the halved subtraction of the high halfwords, in the high halfword of the return value. - \remark - res[15:0] = (val1[15:0] - val2[15:0]) >> 1 \n - res[31:16] = (val1[31:16] - val2[31:16]) >> 1 - */ -__ALWAYS_STATIC_INLINE uint32_t __SHSUB16(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = (((((int32_t)x << 16) >> 16) - (((int32_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((int32_t)x) >> 16) - (((int32_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - -/** - \brief Dual 16-bit unsigned subtraction with halved results. - \details This function enables you to perform two unsigned 16-bit integer subtractions, halving the results. - \param [in] x first two 16-bit summands. - \param [in] y second two 16-bit summands. - \return the halved subtraction of the low halfwords, in the low halfword of the return value.\n - the halved subtraction of the high halfwords, in the high halfword of the return value. - \remark - res[15:0] = (val1[15:0] - val2[15:0]) >> 1 \n - res[31:16] = (val1[31:16] - val2[31:16]) >> 1 - */ -__ALWAYS_STATIC_INLINE uint32_t __UHSUB16(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = ((((x << 16) >> 16) - ((y << 16) >> 16)) >> 1) & 0x0000FFFF; - s = ((((x) >> 16) - ((y) >> 16)) >> 1) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - -/** - \brief Quad 8-bit signed addition with halved results. - \details This function enables you to perform four signed 8-bit integer subtractions, halving the results. - \param [in] x first four 8-bit summands. - \param [in] y second four 8-bit summands. - \return the halved subtraction of the first bytes from each operand, in the first byte of the return value.\n - the halved subtraction of the second bytes from each operand, in the second byte of the return value.\n - the halved subtraction of the third bytes from each operand, in the third byte of the return value.\n - the halved subtraction of the fourth bytes from each operand, in the fourth byte of the return value. - \remark - res[7:0] = (val1[7:0] - val2[7:0] ) >> 1 \n - res[15:8] = (val1[15:8] - val2[15:8] ) >> 1 \n - res[23:16] = (val1[23:16] - val2[23:16]) >> 1 \n - res[31:24] = (val1[31:24] - val2[31:24]) >> 1 - */ -__ALWAYS_STATIC_INLINE uint32_t __SHSUB8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = (((((int32_t)x << 24) >> 24) - (((int32_t)y << 24) >> 24)) >> 1) & (int32_t)0x000000FF; - s = (((((int32_t)x << 16) >> 24) - (((int32_t)y << 16) >> 24)) >> 1) & (int32_t)0x000000FF; - t = (((((int32_t)x << 8) >> 24) - (((int32_t)y << 8) >> 24)) >> 1) & (int32_t)0x000000FF; - u = (((((int32_t)x) >> 24) - (((int32_t)y) >> 24)) >> 1) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r))); -} - -/** - \brief Quad 8-bit unsigned subtraction with halved results. - \details This function enables you to perform four unsigned 8-bit integer subtractions, halving the results. - \param [in] x first four 8-bit summands. - \param [in] y second four 8-bit summands. - \return the halved subtraction of the first bytes from each operand, in the first byte of the return value.\n - the halved subtraction of the second bytes from each operand, in the second byte of the return value.\n - the halved subtraction of the third bytes from each operand, in the third byte of the return value.\n - the halved subtraction of the fourth bytes from each operand, in the fourth byte of the return value. - \remark - res[7:0] = (val1[7:0] - val2[7:0] ) >> 1 \n - res[15:8] = (val1[15:8] - val2[15:8] ) >> 1 \n - res[23:16] = (val1[23:16] - val2[23:16]) >> 1 \n - res[31:24] = (val1[31:24] - val2[31:24]) >> 1 - */ -__ALWAYS_STATIC_INLINE uint32_t __UHSUB8(uint32_t x, uint32_t y) -{ - int32_t r, s, t, u; - - r = ((((x << 24) >> 24) - ((y << 24) >> 24)) >> 1) & 0x000000FF; - s = ((((x << 16) >> 24) - ((y << 16) >> 24)) >> 1) & 0x000000FF; - t = ((((x << 8) >> 24) - ((y << 8) >> 24)) >> 1) & 0x000000FF; - u = ((((x) >> 24) - ((y) >> 24)) >> 1) & 0x000000FF; - - return ((u << 24) | (t << 16) | (s << 8) | (r)); -} - -/** - \brief Dual 16-bit add and subtract with exchange. - \details This function enables you to exchange the halfwords of the one operand, - then add the high halfwords and subtract the low halfwords, - saturating the results to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1. - \param [in] x first operand for the subtraction in the low halfword, - and the first operand for the addition in the high halfword. - \param [in] y second operand for the subtraction in the high halfword, - and the second operand for the addition in the low halfword. - \return the saturated subtraction of the high halfword in the second operand from the - low halfword in the first operand, in the low halfword of the return value.\n - the saturated addition of the high halfword in the first operand and the - low halfword in the second operand, in the high halfword of the return value.\n - The returned results are saturated to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1. - \remark - res[15:0] = val1[15:0] - val2[31:16] \n - res[31:16] = val1[31:16] + val2[15:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __QASX(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = __SSAT(((((int32_t)x << 16) >> 16) - (((int32_t)y) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((int32_t)x) >> 16) + (((int32_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - -/** - \brief Dual 16-bit unsigned saturating addition and subtraction with exchange. - \details This function enables you to exchange the halfwords of the second operand and - perform one unsigned 16-bit integer addition and one unsigned 16-bit subtraction, - saturating the results to the 16-bit unsigned integer range 0 <= x <= 2^16 - 1. - \param [in] x first operand for the subtraction in the low halfword, - and the first operand for the addition in the high halfword. - \param [in] y second operand for the subtraction in the high halfword, - and the second operand for the addition in the low halfword. - \return the saturated subtraction of the high halfword in the second operand from the - low halfword in the first operand, in the low halfword of the return value.\n - the saturated addition of the high halfword in the first operand and the - low halfword in the second operand, in the high halfword of the return value.\n - The returned results are saturated to the 16-bit unsigned integer range 0 <= x <= 2^16 - 1. - \remark - res[15:0] = val1[15:0] - val2[31:16] \n - res[31:16] = val1[31:16] + val2[15:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __UQASX(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = __IUSAT((((x << 16) >> 16) - ((y) >> 16)), 16) & 0x0000FFFF; - s = __IUSAT((((x) >> 16) + ((y << 16) >> 16)), 16) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - -/** - \brief Dual 16-bit addition and subtraction with exchange. - \details It enables you to exchange the halfwords of the second operand, add the high halfwords - and subtract the low halfwords. - \param [in] x first operand for the subtraction in the low halfword, - and the first operand for the addition in the high halfword. - \param [in] y second operand for the subtraction in the high halfword, - and the second operand for the addition in the low halfword. - \return the subtraction of the high halfword in the second operand from the - low halfword in the first operand, in the low halfword of the return value.\n - the addition of the high halfword in the first operand and the - low halfword in the second operand, in the high halfword of the return value. - \remark - res[15:0] = val1[15:0] - val2[31:16] \n - res[31:16] = val1[31:16] + val2[15:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __SASX(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = ((((int32_t)x << 16) >> 16) - (((int32_t)y) >> 16)) & (int32_t)0x0000FFFF; - s = ((((int32_t)x) >> 16) + (((int32_t)y << 16) >> 16)) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - -/** - \brief Dual 16-bit unsigned addition and subtraction with exchange. - \details This function enables you to exchange the two halfwords of the second operand, - add the high halfwords and subtract the low halfwords. - \param [in] x first operand for the subtraction in the low halfword, - and the first operand for the addition in the high halfword. - \param [in] y second operand for the subtraction in the high halfword, - and the second operand for the addition in the low halfword. - \return the subtraction of the high halfword in the second operand from the - low halfword in the first operand, in the low halfword of the return value.\n - the addition of the high halfword in the first operand and the - low halfword in the second operand, in the high halfword of the return value. - \remark - res[15:0] = val1[15:0] - val2[31:16] \n - res[31:16] = val1[31:16] + val2[15:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __UASX(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = (((x << 16) >> 16) - ((y) >> 16)) & 0x0000FFFF; - s = (((x) >> 16) + ((y << 16) >> 16)) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - -/** - \brief Dual 16-bit signed addition and subtraction with halved results. - \details This function enables you to exchange the two halfwords of one operand, perform one - signed 16-bit integer addition and one signed 16-bit subtraction, and halve the results. - \param [in] x first 16-bit operands. - \param [in] y second 16-bit operands. - \return the halved subtraction of the high halfword in the second operand from the - low halfword in the first operand, in the low halfword of the return value.\n - the halved addition of the low halfword in the second operand from the high - halfword in the first operand, in the high halfword of the return value. - \remark - res[15:0] = (val1[15:0] - val2[31:16]) >> 1 \n - res[31:16] = (val1[31:16] + val2[15:0]) >> 1 - */ -__ALWAYS_STATIC_INLINE uint32_t __SHASX(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = (((((int32_t)x << 16) >> 16) - (((int32_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((int32_t)x) >> 16) + (((int32_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - -/** - \brief Dual 16-bit unsigned addition and subtraction with halved results and exchange. - \details This function enables you to exchange the halfwords of the second operand, - add the high halfwords and subtract the low halfwords, halving the results. - \param [in] x first operand for the subtraction in the low halfword, and - the first operand for the addition in the high halfword. - \param [in] y second operand for the subtraction in the high halfword, and - the second operand for the addition in the low halfword. - \return the halved subtraction of the high halfword in the second operand from the - low halfword in the first operand, in the low halfword of the return value.\n - the halved addition of the low halfword in the second operand from the high - halfword in the first operand, in the high halfword of the return value. - \remark - res[15:0] = (val1[15:0] - val2[31:16]) >> 1 \n - res[31:16] = (val1[31:16] + val2[15:0]) >> 1 - */ -__ALWAYS_STATIC_INLINE uint32_t __UHASX(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = ((((x << 16) >> 16) - ((y) >> 16)) >> 1) & 0x0000FFFF; - s = ((((x) >> 16) + ((y << 16) >> 16)) >> 1) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - -/** - \brief Dual 16-bit subtract and add with exchange. - \details This function enables you to exchange the halfwords of one operand, - then subtract the high halfwords and add the low halfwords, - saturating the results to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1. - \param [in] x first operand for the addition in the low halfword, - and the first operand for the subtraction in the high halfword. - \param [in] y second operand for the addition in the high halfword, - and the second operand for the subtraction in the low halfword. - \return the saturated addition of the low halfword of the first operand and the high - halfword of the second operand, in the low halfword of the return value.\n - the saturated subtraction of the low halfword of the second operand from the - high halfword of the first operand, in the high halfword of the return value.\n - The returned results are saturated to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1. - \remark - res[15:0] = val1[15:0] + val2[31:16] \n - res[31:16] = val1[31:16] - val2[15:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __QSAX(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = __SSAT(((((int32_t)x << 16) >> 16) + (((int32_t)y) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((int32_t)x) >> 16) - (((int32_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - -/** - \brief Dual 16-bit unsigned saturating subtraction and addition with exchange. - \details This function enables you to exchange the halfwords of the second operand and perform - one unsigned 16-bit integer subtraction and one unsigned 16-bit addition, saturating - the results to the 16-bit unsigned integer range 0 <= x <= 2^16 - 1. - \param [in] x first operand for the addition in the low halfword, - and the first operand for the subtraction in the high halfword. - \param [in] y second operand for the addition in the high halfword, - and the second operand for the subtraction in the low halfword. - \return the saturated addition of the low halfword of the first operand and the high - halfword of the second operand, in the low halfword of the return value.\n - the saturated subtraction of the low halfword of the second operand from the - high halfword of the first operand, in the high halfword of the return value.\n - The returned results are saturated to the 16-bit unsigned integer range 0 <= x <= 2^16 - 1. - \remark - res[15:0] = val1[15:0] + val2[31:16] \n - res[31:16] = val1[31:16] - val2[15:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __UQSAX(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = __IUSAT((((x << 16) >> 16) + ((y) >> 16)), 16) & 0x0000FFFF; - s = __IUSAT((((x) >> 16) - ((y << 16) >> 16)), 16) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - -/** - \brief Dual 16-bit unsigned subtract and add with exchange. - \details This function enables you to exchange the halfwords of the second operand, - subtract the high halfwords and add the low halfwords. - \param [in] x first operand for the addition in the low halfword, - and the first operand for the subtraction in the high halfword. - \param [in] y second operand for the addition in the high halfword, - and the second operand for the subtraction in the low halfword. - \return the addition of the low halfword of the first operand and the high - halfword of the second operand, in the low halfword of the return value.\n - the subtraction of the low halfword of the second operand from the - high halfword of the first operand, in the high halfword of the return value.\n - \remark - res[15:0] = val1[15:0] + val2[31:16] \n - res[31:16] = val1[31:16] - val2[15:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __USAX(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = (((x << 16) >> 16) + ((y) >> 16)) & 0x0000FFFF; - s = (((x) >> 16) - ((y << 16) >> 16)) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - -/** - \brief Dual 16-bit signed subtraction and addition with exchange. - \details This function enables you to exchange the two halfwords of one operand and perform one - 16-bit integer subtraction and one 16-bit addition. - \param [in] x first operand for the addition in the low halfword, and the first operand - for the subtraction in the high halfword. - \param [in] y second operand for the addition in the high halfword, and the second - operand for the subtraction in the low halfword. - \return the addition of the low halfword of the first operand and the high - halfword of the second operand, in the low halfword of the return value.\n - the subtraction of the low halfword of the second operand from the - high halfword of the first operand, in the high halfword of the return value.\n - \remark - res[15:0] = val1[15:0] + val2[31:16] \n - res[31:16] = val1[31:16] - val2[15:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __SSAX(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = ((((int32_t)x << 16) >> 16) + (((int32_t)y) >> 16)) & (int32_t)0x0000FFFF; - s = ((((int32_t)x) >> 16) - (((int32_t)y << 16) >> 16)) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - - -/** - \brief Dual 16-bit signed subtraction and addition with halved results. - \details This function enables you to exchange the two halfwords of one operand, perform one signed - 16-bit integer subtraction and one signed 16-bit addition, and halve the results. - \param [in] x first 16-bit operands. - \param [in] y second 16-bit operands. - \return the halved addition of the low halfword in the first operand and the - high halfword in the second operand, in the low halfword of the return value.\n - the halved subtraction of the low halfword in the second operand from the - high halfword in the first operand, in the high halfword of the return value. - \remark - res[15:0] = (val1[15:0] + val2[31:16]) >> 1 \n - res[31:16] = (val1[31:16] - val2[15:0]) >> 1 - */ -__ALWAYS_STATIC_INLINE uint32_t __SHSAX(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = (((((int32_t)x << 16) >> 16) + (((int32_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((int32_t)x) >> 16) - (((int32_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r))); -} - -/** - \brief Dual 16-bit unsigned subtraction and addition with halved results and exchange. - \details This function enables you to exchange the halfwords of the second operand, - subtract the high halfwords and add the low halfwords, halving the results. - \param [in] x first operand for the addition in the low halfword, and - the first operand for the subtraction in the high halfword. - \param [in] y second operand for the addition in the high halfword, and - the second operand for the subtraction in the low halfword. - \return the halved addition of the low halfword in the first operand and the - high halfword in the second operand, in the low halfword of the return value.\n - the halved subtraction of the low halfword in the second operand from the - high halfword in the first operand, in the high halfword of the return value. - \remark - res[15:0] = (val1[15:0] + val2[31:16]) >> 1 \n - res[31:16] = (val1[31:16] - val2[15:0]) >> 1 - */ -__ALWAYS_STATIC_INLINE uint32_t __UHSAX(uint32_t x, uint32_t y) -{ - int32_t r, s; - - r = ((((x << 16) >> 16) + ((y) >> 16)) >> 1) & 0x0000FFFF; - s = ((((x) >> 16) - ((y << 16) >> 16)) >> 1) & 0x0000FFFF; - - return ((s << 16) | (r)); -} - -/** - \brief Dual 16-bit signed multiply with exchange returning difference. - \details This function enables you to perform two 16-bit signed multiplications, subtracting - one of the products from the other. The halfwords of the second operand are exchanged - before performing the arithmetic. This produces top * bottom and bottom * top multiplication. - \param [in] x first 16-bit operands for each multiplication. - \param [in] y second 16-bit operands for each multiplication. - \return the difference of the products of the two 16-bit signed multiplications. - \remark - p1 = val1[15:0] * val2[31:16] \n - p2 = val1[31:16] * val2[15:0] \n - res[31:0] = p1 - p2 - */ -__ALWAYS_STATIC_INLINE uint32_t __SMUSDX(uint32_t x, uint32_t y) -{ - return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y) >> 16)) - - ((((int32_t)x) >> 16) * (((int32_t)y << 16) >> 16)))); -} - -/** - \brief Sum of dual 16-bit signed multiply with exchange. - \details This function enables you to perform two 16-bit signed multiplications with exchanged - halfwords of the second operand, adding the products together. - \param [in] x first 16-bit operands for each multiplication. - \param [in] y second 16-bit operands for each multiplication. - \return the sum of the products of the two 16-bit signed multiplications with exchanged halfwords of the second operand. - \remark - p1 = val1[15:0] * val2[31:16] \n - p2 = val1[31:16] * val2[15:0] \n - res[31:0] = p1 + p2 - */ -__ALWAYS_STATIC_INLINE uint32_t __SMUADX(uint32_t x, uint32_t y) -{ - return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y) >> 16)) + - ((((int32_t)x) >> 16) * (((int32_t)y << 16) >> 16)))); -} - - -/** - \brief Saturating add. - \details This function enables you to obtain the saturating add of two integers. - \param [in] x first summand of the saturating add operation. - \param [in] y second summand of the saturating add operation. - \return the saturating addition of val1 and val2. - \remark - res[31:0] = SAT(val1 + SAT(val2)) - */ -__ALWAYS_STATIC_INLINE int32_t __QADD(int32_t x, int32_t y) -{ - int32_t result; - - if (y >= 0) { - if (x + y >= x) { - result = x + y; - } else { - result = 0x7FFFFFFF; - } - } else { - if (x + y < x) { - result = x + y; - } else { - result = 0x80000000; - } - } - - return result; -} - -/** - \brief Saturating subtract. - \details This function enables you to obtain the saturating add of two integers. - \param [in] x first summand of the saturating add operation. - \param [in] y second summand of the saturating add operation. - \return the saturating addition of val1 and val2. - \remark - res[31:0] = SAT(val1 - SAT(val2)) - */ -__ALWAYS_STATIC_INLINE int32_t __QSUB(int32_t x, int32_t y) -{ - int64_t tmp; - int32_t result; - - tmp = (int64_t)x - (int64_t)y; - - if (tmp > 0x7fffffff) { - tmp = 0x7fffffff; - } else if (tmp < (-2147483647 - 1)) { - tmp = -2147483647 - 1; - } - - result = tmp; - return result; -} - -/** - \brief Dual 16-bit signed multiply with single 32-bit accumulator. - \details This function enables you to perform two signed 16-bit multiplications, - adding both results to a 32-bit accumulate operand. - \param [in] x first 16-bit operands for each multiplication. - \param [in] y second 16-bit operands for each multiplication. - \param [in] sum accumulate value. - \return the product of each multiplication added to the accumulate value, as a 32-bit integer. - \remark - p1 = val1[15:0] * val2[15:0] \n - p2 = val1[31:16] * val2[31:16] \n - res[31:0] = p1 + p2 + val3[31:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __SMLAD(uint32_t x, uint32_t y, uint32_t sum) -{ - return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y << 16) >> 16)) + - ((((int32_t)x) >> 16) * (((int32_t)y) >> 16)) + - (((int32_t)sum)))); -} - -/** - \brief Pre-exchanged dual 16-bit signed multiply with single 32-bit accumulator. - \details This function enables you to perform two signed 16-bit multiplications with exchanged - halfwords of the second operand, adding both results to a 32-bit accumulate operand. - \param [in] x first 16-bit operands for each multiplication. - \param [in] y second 16-bit operands for each multiplication. - \param [in] sum accumulate value. - \return the product of each multiplication with exchanged halfwords of the second - operand added to the accumulate value, as a 32-bit integer. - \remark - p1 = val1[15:0] * val2[31:16] \n - p2 = val1[31:16] * val2[15:0] \n - res[31:0] = p1 + p2 + val3[31:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __SMLADX(uint32_t x, uint32_t y, uint32_t sum) -{ - return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y) >> 16)) + - ((((int32_t)x) >> 16) * (((int32_t)y << 16) >> 16)) + - (((int32_t)sum)))); -} - -/** - \brief Dual 16-bit signed multiply with exchange subtract with 32-bit accumulate. - \details This function enables you to perform two 16-bit signed multiplications, take the - difference of the products, subtracting the high halfword product from the low - halfword product, and add the difference to a 32-bit accumulate operand. - \param [in] x first 16-bit operands for each multiplication. - \param [in] y second 16-bit operands for each multiplication. - \param [in] sum accumulate value. - \return the difference of the product of each multiplication, added to the accumulate value. - \remark - p1 = val1[15:0] * val2[15:0] \n - p2 = val1[31:16] * val2[31:16] \n - res[31:0] = p1 - p2 + val3[31:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __SMLSD(uint32_t x, uint32_t y, uint32_t sum) -{ - return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y << 16) >> 16)) - - ((((int32_t)x) >> 16) * (((int32_t)y) >> 16)) + - (((int32_t)sum)))); -} - -/** - \brief Dual 16-bit signed multiply with exchange subtract with 32-bit accumulate. - \details This function enables you to exchange the halfwords in the second operand, then perform two 16-bit - signed multiplications. The difference of the products is added to a 32-bit accumulate operand. - \param [in] x first 16-bit operands for each multiplication. - \param [in] y second 16-bit operands for each multiplication. - \param [in] sum accumulate value. - \return the difference of the product of each multiplication, added to the accumulate value. - \remark - p1 = val1[15:0] * val2[31:16] \n - p2 = val1[31:16] * val2[15:0] \n - res[31:0] = p1 - p2 + val3[31:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __SMLSDX(uint32_t x, uint32_t y, uint32_t sum) -{ - return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y) >> 16)) - - ((((int32_t)x) >> 16) * (((int32_t)y << 16) >> 16)) + - (((int32_t)sum)))); -} - -/** - \brief Dual 16-bit signed multiply with single 64-bit accumulator. - \details This function enables you to perform two signed 16-bit multiplications, adding both results - to a 64-bit accumulate operand. Overflow is only possible as a result of the 64-bit addition. - This overflow is not detected if it occurs. Instead, the result wraps around modulo2^64. - \param [in] x first 16-bit operands for each multiplication. - \param [in] y second 16-bit operands for each multiplication. - \param [in] sum accumulate value. - \return the product of each multiplication added to the accumulate value. - \remark - p1 = val1[15:0] * val2[15:0] \n - p2 = val1[31:16] * val2[31:16] \n - sum = p1 + p2 + val3[63:32][31:0] \n - res[63:32] = sum[63:32] \n - res[31:0] = sum[31:0] - */ -__ALWAYS_STATIC_INLINE uint64_t __SMLALD(uint32_t x, uint32_t y, uint64_t sum) -{ - return ((uint64_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y << 16) >> 16)) + - ((((int32_t)x) >> 16) * (((int32_t)y) >> 16)) + - (((uint64_t)sum)))); -} - -/** - \brief Dual 16-bit signed multiply with exchange with single 64-bit accumulator. - \details This function enables you to exchange the halfwords of the second operand, and perform two - signed 16-bit multiplications, adding both results to a 64-bit accumulate operand. Overflow - is only possible as a result of the 64-bit addition. This overflow is not detected if it occurs. - Instead, the result wraps around modulo2^64. - \param [in] x first 16-bit operands for each multiplication. - \param [in] y second 16-bit operands for each multiplication. - \param [in] sum accumulate value. - \return the product of each multiplication added to the accumulate value. - \remark - p1 = val1[15:0] * val2[31:16] \n - p2 = val1[31:16] * val2[15:0] \n - sum = p1 + p2 + val3[63:32][31:0] \n - res[63:32] = sum[63:32] \n - res[31:0] = sum[31:0] - */ -__ALWAYS_STATIC_INLINE uint64_t __SMLALDX(uint32_t x, uint32_t y, uint64_t sum) -{ - return ((uint64_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y) >> 16)) + - ((((int32_t)x) >> 16) * (((int32_t)y << 16) >> 16)) + - (((uint64_t)sum)))); -} - -/** - \brief dual 16-bit signed multiply subtract with 64-bit accumulate. - \details This function It enables you to perform two 16-bit signed multiplications, take the difference - of the products, subtracting the high halfword product from the low halfword product, and add the - difference to a 64-bit accumulate operand. Overflow cannot occur during the multiplications or the - subtraction. Overflow can occur as a result of the 64-bit addition, and this overflow is not - detected. Instead, the result wraps round to modulo2^64. - \param [in] x first 16-bit operands for each multiplication. - \param [in] y second 16-bit operands for each multiplication. - \param [in] sum accumulate value. - \return the difference of the product of each multiplication, added to the accumulate value. - \remark - p1 = val1[15:0] * val2[15:0] \n - p2 = val1[31:16] * val2[31:16] \n - res[63:32][31:0] = p1 - p2 + val3[63:32][31:0] - */ -__ALWAYS_STATIC_INLINE uint64_t __SMLSLD(uint32_t x, uint32_t y, uint64_t sum) -{ - return ((uint64_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y << 16) >> 16)) - - ((((int32_t)x) >> 16) * (((int32_t)y) >> 16)) + - (((uint64_t)sum)))); -} - -/** - \brief Dual 16-bit signed multiply with exchange subtract with 64-bit accumulate. - \details This function enables you to exchange the halfwords of the second operand, perform two 16-bit multiplications, - adding the difference of the products to a 64-bit accumulate operand. Overflow cannot occur during the - multiplications or the subtraction. Overflow can occur as a result of the 64-bit addition, and this overflow - is not detected. Instead, the result wraps round to modulo2^64. - \param [in] x first 16-bit operands for each multiplication. - \param [in] y second 16-bit operands for each multiplication. - \param [in] sum accumulate value. - \return the difference of the product of each multiplication, added to the accumulate value. - \remark - p1 = val1[15:0] * val2[31:16] \n - p2 = val1[31:16] * val2[15:0] \n - res[63:32][31:0] = p1 - p2 + val3[63:32][31:0] - */ -__ALWAYS_STATIC_INLINE uint64_t __SMLSLDX(uint32_t x, uint32_t y, uint64_t sum) -{ - return ((uint64_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y) >> 16)) - - ((((int32_t)x) >> 16) * (((int32_t)y << 16) >> 16)) + - (((uint64_t)sum)))); -} - -/** - \brief 32-bit signed multiply with 32-bit truncated accumulator. - \details This function enables you to perform a signed 32-bit multiplications, adding the most - significant 32 bits of the 64-bit result to a 32-bit accumulate operand. - \param [in] x first operand for multiplication. - \param [in] y second operand for multiplication. - \param [in] sum accumulate value. - \return the product of multiplication (most significant 32 bits) is added to the accumulate value, as a 32-bit integer. - \remark - p = val1 * val2 \n - res[31:0] = p[63:32] + val3[31:0] - */ -__ALWAYS_STATIC_INLINE uint32_t __SMMLA(int32_t x, int32_t y, int32_t sum) -{ - return (uint32_t)((int32_t)((int64_t)((int64_t)x * (int64_t)y) >> 32) + sum); -} - -/** - \brief Sum of dual 16-bit signed multiply. - \details This function enables you to perform two 16-bit signed multiplications, adding the products together. - \param [in] x first 16-bit operands for each multiplication. - \param [in] y second 16-bit operands for each multiplication. - \return the sum of the products of the two 16-bit signed multiplications. - \remark - p1 = val1[15:0] * val2[15:0] \n - p2 = val1[31:16] * val2[31:16] \n - res[31:0] = p1 + p2 - */ -__ALWAYS_STATIC_INLINE uint32_t __SMUAD(uint32_t x, uint32_t y) -{ - return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y << 16) >> 16)) + - ((((int32_t)x) >> 16) * (((int32_t)y) >> 16)))); -} - -/** - \brief Dual 16-bit signed multiply returning difference. - \details This function enables you to perform two 16-bit signed multiplications, taking the difference - of the products by subtracting the high halfword product from the low halfword product. - \param [in] x first 16-bit operands for each multiplication. - \param [in] y second 16-bit operands for each multiplication. - \return the difference of the products of the two 16-bit signed multiplications. - \remark - p1 = val1[15:0] * val2[15:0] \n - p2 = val1[31:16] * val2[31:16] \n - res[31:0] = p1 - p2 - */ -__ALWAYS_STATIC_INLINE uint32_t __SMUSD(uint32_t x, uint32_t y) -{ - return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y << 16) >> 16)) - - ((((int32_t)x) >> 16) * (((int32_t)y) >> 16)))); -} - -/** - \brief Dual extracted 8-bit to 16-bit signed addition. - \details This function enables you to extract two 8-bit values from the second operand (at bit positions - [7:0] and [23:16]), sign-extend them to 16-bits each, and add the results to the first operand. - \param [in] x values added to the sign-extended to 16-bit values. - \param [in] y two 8-bit values to be extracted and sign-extended. - \return the addition of val1 and val2, where the 8-bit values in val2[7:0] and - val2[23:16] have been extracted and sign-extended prior to the addition. - \remark - res[15:0] = val1[15:0] + SignExtended(val2[7:0]) \n - res[31:16] = val1[31:16] + SignExtended(val2[23:16]) - */ -__ALWAYS_STATIC_INLINE uint32_t __SXTAB16(uint32_t x, uint32_t y) -{ - return ((uint32_t)((((((int32_t)y << 24) >> 24) + (((int32_t)x << 16) >> 16)) & (int32_t)0x0000FFFF) | - (((((int32_t)y << 8) >> 8) + (((int32_t)x >> 16) << 16)) & (int32_t)0xFFFF0000))); -} - -/** - \brief Extracted 16-bit to 32-bit unsigned addition. - \details This function enables you to extract two 8-bit values from one operand, zero-extend - them to 16 bits each, and add the results to two 16-bit values from another operand. - \param [in] x values added to the zero-extended to 16-bit values. - \param [in] y two 8-bit values to be extracted and zero-extended. - \return the addition of val1 and val2, where the 8-bit values in val2[7:0] and - val2[23:16] have been extracted and zero-extended prior to the addition. - \remark - res[15:0] = ZeroExt(val2[7:0] to 16 bits) + val1[15:0] \n - res[31:16] = ZeroExt(val2[31:16] to 16 bits) + val1[31:16] - */ -__ALWAYS_STATIC_INLINE uint32_t __UXTAB16(uint32_t x, uint32_t y) -{ - return ((uint32_t)(((((y << 24) >> 24) + ((x << 16) >> 16)) & 0x0000FFFF) | - ((((y << 8) >> 8) + ((x >> 16) << 16)) & 0xFFFF0000))); -} - -/** - \brief Dual extract 8-bits and sign extend each to 16-bits. - \details This function enables you to extract two 8-bit values from an operand and sign-extend them to 16 bits each. - \param [in] x two 8-bit values in val[7:0] and val[23:16] to be sign-extended. - \return the 8-bit values sign-extended to 16-bit values.\n - sign-extended value of val[7:0] in the low halfword of the return value.\n - sign-extended value of val[23:16] in the high halfword of the return value. - \remark - res[15:0] = SignExtended(val[7:0]) \n - res[31:16] = SignExtended(val[23:16]) - */ -__ALWAYS_STATIC_INLINE uint32_t __SXTB16(uint32_t x) -{ - return ((uint32_t)(((((int32_t)x << 24) >> 24) & (int32_t)0x0000FFFF) | - ((((int32_t)x << 8) >> 8) & (int32_t)0xFFFF0000))); -} - -/** - \brief Dual extract 8-bits and zero-extend to 16-bits. - \details This function enables you to extract two 8-bit values from an operand and zero-extend them to 16 bits each. - \param [in] x two 8-bit values in val[7:0] and val[23:16] to be zero-extended. - \return the 8-bit values sign-extended to 16-bit values.\n - sign-extended value of val[7:0] in the low halfword of the return value.\n - sign-extended value of val[23:16] in the high halfword of the return value. - \remark - res[15:0] = SignExtended(val[7:0]) \n - res[31:16] = SignExtended(val[23:16]) - */ -__ALWAYS_STATIC_INLINE uint32_t __UXTB16(uint32_t x) -{ - return ((uint32_t)((((x << 24) >> 24) & 0x0000FFFF) | - (((x << 8) >> 8) & 0xFFFF0000))); -} - -#endif /* _CSI_GCC_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/adc.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/adc.h deleted file mode 100755 index dd69fd3d..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/adc.h +++ /dev/null @@ -1,213 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/adc.h - * @brief Header File for ADC Driver - * @version V1.0 - * @date 08. Apr 2020 - * @model adc - ******************************************************************************/ - -#ifndef _DRV_ADC_H_ -#define _DRV_ADC_H_ - -#include <stdint.h> -#include <stdbool.h> - -#include <drv/common.h> -#include <drv/dma.h> -#include <csi_core.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/****** ADC Event *****/ -typedef enum { - ADC_EVENT_CONVERT_COMPLETE = 0, ///< All data convert completed - ADC_EVENT_CONVERT_HALF_DONE, ///< Convert half done - ADC_EVENT_ERROR ///< All errors including but not limited to what converted data has not been read before the new conversion result is load to the data register -} csi_adc_event_t; - -typedef struct csi_adc csi_adc_t; -struct csi_adc { - csi_dev_t dev; ///< Hw-device info - void (*callback)(csi_adc_t *adc, csi_adc_event_t event, void *arg); ///< User callback ,signaled by driver event - void *arg; ///< User private param ,passed to user callback - uint32_t *data; ///< Data buf - uint32_t num; ///< Data size by word - csi_dma_ch_t *dma; ///< Dma channel handle - csi_error_t (*start)(csi_adc_t *adc); ///< Start function - csi_error_t (*stop)(csi_adc_t *adc); ///< Stop function - csi_state_t state; ///< ADC current state - void *priv; -}; - -/** - \brief Initialize adc Interface. Initialize the resources needed for the adc interface - \param[in] adc ADC handle to operate - \param[in] idx ADC controller index - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_init(csi_adc_t *adc, uint32_t idx); - -/** - \brief De-initialize adc Interface. stops operation and releases the software resources used by the interface - \param[in] handle ADC handle to operate - \return None -*/ -void csi_adc_uninit(csi_adc_t *adc); - -/** - \brief Set adc receive buffer - \param[in] adc ADC handle to operate - \param[in] num The receive data length by word. - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_set_buffer(csi_adc_t *adc, uint32_t *data, uint32_t num); - -/** - \brief Start adc - \param[in] handle ADC handle to operate - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_start(csi_adc_t *adc); - -/** - \brief Enable dma or interrupt, and start adc conversion - \param[in] handle ADC handle to operate - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_start_async(csi_adc_t *adc); - -/** - \brief Stop adc - \param[in] handle ADC handle to operate - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_stop(csi_adc_t *adc); - -/** - \brief Disable dma or interrupt, and stop adc conversion - \param[in] handle ADC handle to operate - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_stop_async(csi_adc_t *adc); - -/** - \brief ADC channel enable - \param[in] adc ADC handle to operate - \param[in] ch_id ADC channel id - \param[in] is_enable true->enable, false->disable - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_channel_enable(csi_adc_t *adc, uint8_t ch_id, bool is_enable); - -/** - \brief Set the ADC sampling time for the selected channel - \param[in] adc ADC handle to operate - \param[in] ch_id ADC channel id - \param[in] clock_num Channel sampling clock number - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_channel_sampling_time(csi_adc_t *adc, uint8_t ch_id, uint16_t clock_num); - -/** - \brief Set the ADC controller sampling time - \param[in] adc ADC handle to operate - \param[in] clock_num ADC controller sampling clock number - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_sampling_time(csi_adc_t *adc, uint16_t clock_num); - -/** - \brief Enable the continue mode of ADC - \param[in] adc ADC handle to operate - \param[in] is_enable true->enable, false->disable - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_continue_mode(csi_adc_t *adc, bool is_enable); - -/** - \brief Set ADC frequence division - \param[in] adc ADC handle to operate - \param[in] div The division of frequence - \return The actual config frequency -*/ -uint32_t csi_adc_freq_div(csi_adc_t *adc, uint32_t div); - -/** - \brief Receiving data from ADC receiver - \param[in] handle ADC handle to operate - \return If read successful, this function shall return the result of convert value - otherwise, the function shall return error code -*/ -int32_t csi_adc_read(csi_adc_t *adc); - -/** - \brief Get ADC state - \param[in] adc ADC handle to operate - \param[in] state ADC state - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_get_state(csi_adc_t *adc, csi_state_t *state); - -/** - \brief Attach the callback handler to adc - \param[in] adc Operate handle - \param[in] callback Callback function - \param[in] arg User can define it by himself as callback's param - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_attach_callback(csi_adc_t *adc, void *callback, void *arg); - -/** - \brief Detach the callback handler - \param[in] adc Operate handle - \return None -*/ -void csi_adc_detach_callback(csi_adc_t *adc); - -/** - \brief Link DMA channel to adc device - \param[in] adc ADC handle to operate - \param[in] dma The DMA channel handle for send, when it is NULL means to unlink the channel - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_link_dma(csi_adc_t *adc, csi_dma_ch_t *dma); - -/** - \brief Enable adc low power mode - \param[in] adc ADC handle to operate - \return Error code \ref csi_error_t -*/ -csi_error_t csi_adc_enable_pm(csi_adc_t *adc); - -/** - \brief Disable adc low power mode - \param[in] adc ADC handle to operate - \return None -*/ -void csi_adc_disable_pm(csi_adc_t *adc); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_ADC_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/aes.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/aes.h deleted file mode 100755 index a395fa7c..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/aes.h +++ /dev/null @@ -1,309 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/aes.h - * @brief Header File for AES Driver - * @version V1.0 - * @date 9. Oct 2020 - * @model aes - ******************************************************************************/ - -#ifndef _DRV_AES_H_ -#define _DRV_AES_H_ - -#include <stdint.h> -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/*----- Encrypt & Decrypt: Config key length -----*/ -typedef enum { - AES_KEY_LEN_BITS_128 = 0, /* 128 Data bits */ - AES_KEY_LEN_BITS_192, /* 192 Data bits */ - AES_KEY_LEN_BITS_256 /* 256 Data bits */ -} csi_aes_key_bits_t; - -/** -\brief AES Ctrl Block -*/ -typedef struct { - csi_dev_t dev; - void *priv; -} csi_aes_t; - -/** - \brief Initialize AES interface. Initializes the resources needed for the AES interface - \param[in] aes Handle to operate - \param[in] idx Device id - \return Error code \ref csi_error_t -*/ -csi_error_t csi_aes_init(csi_aes_t *aes, uint32_t idx); - -/** - \brief De-initialize AES interface. Stops operation and releases the software resources used by the interface - \param[in] aes Dandle to operate - \return None -*/ -void csi_aes_uninit(csi_aes_t *aes); - -/** - \brief Set encrypt key - \param[in] aes Handle to operate - \param[in] key Pointer to the key buf - \param[in] key_len Pointer to \ref csi_aes_key_bits_t - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_aes_set_encrypt_key(csi_aes_t *aes, void *key, csi_aes_key_bits_t key_len); - -/** - \brief Set decrypt key - \param[in] aes Handle to operate - \param[in] key Pointer to the key buf - \param[in] key_len Pointer to \ref csi_aes_key_bits_t - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_aes_set_decrypt_key(csi_aes_t *aes, void *key, csi_aes_key_bits_t key_len); -/** - \brief Set encrypt key2. This API is used for the algorithm which has two keys, - such as xts, used for the key of tweak - \param[in] aes Handle to operate - \param[in] key Pointer to the key buf - \param[in] key_len Pointer to \ref csi_aes_key_bits_t - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_aes_set_encrypt_key2(csi_aes_t *aes, void *key, csi_aes_key_bits_t key_len); - -/** - \brief Set decrypt key2. This API is used for the algorithm which has two keys, - such as xts, used for the key of tweak - \param[in] aes Handle to operate - \param[in] key Pointer to the key buf - \param[in] key_len Pointer to \ref csi_aes_key_bits_t - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_aes_set_decrypt_key2(csi_aes_t *aes, void *key, csi_aes_key_bits_t key_len); - -/** - \brief AES ecb encrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_aes_ecb_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size); - -/** - \brief AES ecb decrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_aes_ecb_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size); - -/** - \brief AES cbc encrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_aes_cbc_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv); - -/** - \brief AES cbc decrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_aes_cbc_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv); - -/** - \brief AES cfb1 encrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_aes_cfb1_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv); - -/** - \brief AES cfb1 decrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_aes_cfb1_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv); - -/** - \brief AES cfb8 encrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_aes_cfb8_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv); - -/** - \brief AES cfb8 decrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_aes_cfb8_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv); - -/** - \brief AES cfb128 decrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \param[out] num The number of the 128-bit block we have used - \return Error code \ref csi_error_t -*/ -csi_error_t csi_aes_cfb128_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv, uint32_t *num); - -/** - \brief AES cfb128 encrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \param[out] num The number of the 128-bit block we have used - \return Error code \ref csi_error_t -*/ -csi_error_t csi_aes_cfb128_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv, uint32_t *num); - -/** - \brief AES ofb encrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \param[out] num The number of the 128-bit block we have used - \return Error code \ref csi_error_t -*/ -csi_error_t csi_aes_ofb_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv, uint32_t *num); - -/** - \brief AES ofb decrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \param[out] num The number of the 128-bit block we have used - \return Error code \ref csi_error_t -*/ -csi_error_t csi_aes_ofb_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv, uint32_t *num); - -/** - \brief AES ctr encrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref csi_error_t -*/ -csi_error_t csi_aes_ctr_encrypt(csi_aes_t *aes, void *in,void *out, uint32_t size, void *iv); - -/** - \brief AES ctr decrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vecotr - \return Error code \ref csi_error_t -*/ -csi_error_t csi_aes_ctr_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv); - -/** - \brief AES cts encrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref csi_error_t -*/ -csi_error_t csi_aes_cts_encrypt(csi_aes_t *aes, void *in,void *out, uint32_t size, void *iv); - -/** - \brief AES cts decrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vecotr - \return Error code \ref csi_error_t -*/ -csi_error_t csi_aes_cts_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv); - - -/** - \brief AES xts encrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref csi_error_t -*/ -csi_error_t csi_aes_xts_encrypt(csi_aes_t *aes, void *in,void *out, uint32_t size, void *iv); - -/** - \brief AES xts decrypt - \param[in] aes Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vecotr - \return Error code \ref csi_error_t -*/ -csi_error_t csi_aes_xts_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_AES_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/baud_calc.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/baud_calc.h deleted file mode 100755 index 1a077c10..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/baud_calc.h +++ /dev/null @@ -1,60 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/baud_calc.h - * @brief Header File for the PWM capture uart bandrate Driver - * @version V1.0 - * @date 9. Oct 2020 - * @model baud_calc - ******************************************************************************/ - -#ifndef _DRV_BAUD_CALC_H_ -#define _DRV_BAUD_CALC_H_ - -#include <stdint.h> -#include <soc.h> -#include <csi_core.h> -#include <drv/common.h> - - -#ifdef __cplusplus -extern "C" { -#endif - -/** - \brief Baud rate calculation(Algorithm level) - \param[in] idx PWM idx - \param[in] channel Channel num - \return Error code(-1) or Baudare value -*/ -int drv_calc_baud_adjust(uint32_t idx, uint32_t channel); - -/** - \brief Baud rate calculation(Capture level) - \param[in] idx PWM idx - \param[in] channel Channel num - \return Error code(-1) or Baudare value -*/ -int drv_calc_baud_original(uint32_t idx, uint32_t channel); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_BAUD_CALC_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/codec.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/codec.h deleted file mode 100755 index d96a40b0..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/codec.h +++ /dev/null @@ -1,450 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/codec.h - * @brief head file for codec - * @version V1.0 - * @date 17. Mar 2020 - * @model codec - ******************************************************************************/ -#ifndef _DRV_CODEC_H_ -#define _DRV_CODEC_H_ - -#include <stdint.h> -#include <stdbool.h> -#include <drv/common.h> -#include <drv/dma.h> -#include "drv/ringbuf.h" - -typedef enum { - CODEC_EVENT_PERIOD_READ_COMPLETE = 0U, ///< A peroid data read completed - CODEC_EVENT_PERIOD_WRITE_COMPLETE = 1U, ///< A peroid data write completed - CODEC_EVENT_WRITE_BUFFER_EMPTY = 2U, ///< Fifo is empty - CODEC_EVENT_READ_BUFFER_FULL = 3U, ///< Fifo is full - CODEC_EVENT_ERROR_OVERFLOW = 4U, ///< Fifo overflow error - CODEC_EVENT_ERROR_UNDERFLOW = 5U, ///< Fifo underflow error - CODEC_EVENT_ERROR = 6U, ///< The device has a hardware error -} csi_codec_event_t; - -struct csi_codec; -typedef struct csi_codec csi_codec_t; -typedef struct csi_codec_output csi_codec_output_t; -struct csi_codec_output { - csi_codec_t *codec; - uint32_t ch_idx; ///< Codec output channel idx - void (*callback)(csi_codec_output_t *output, csi_codec_event_t event, void *arg); - void *arg; - csi_ringbuf_t *ring_buf; ///< The csi_ringbuf used to save audio data - uint32_t period; ///< When the period data is sent, the callback function will be called - uint32_t sound_channel_num; ///< Number of sound channel - csi_dma_ch_t *dma; ///< Dma channel handle - csi_state_t state; ///< Codec output channel current state - void *priv; - struct csi_codec_output *next; -}; - -typedef struct csi_codec_input csi_codec_input_t; -struct csi_codec_input { - csi_codec_t *codec; - uint32_t ch_idx; ///< Codec input channel idx - void (*callback)(csi_codec_input_t *input, csi_codec_event_t event, void *arg); - void *arg; - csi_ringbuf_t *ring_buf; ///< The csi_ringbuf used to save audio data - uint32_t period; ///< When the period data is received, the callback function will be called - uint32_t sound_channel_num; ///< Number of sound channel - csi_dma_ch_t *dma; ///< Codec input channel current state - csi_state_t state; ///< Dma channel handle - void *priv; - struct csi_codec_input *next; -}; - -struct csi_codec { - csi_dev_t dev; ///< Codec hw-device info - csi_codec_output_t *output_chs; ///< Codec output channel operate handle - csi_codec_input_t *input_chs; ///< Codec input channel operate handle - void *priv; ///< User private param passed to user callback -}; - -typedef enum { - CODEC_OUTPUT_SINGLE_ENDED, ///< Single-ended output - CODEC_OUTPUT_DIFFERENCE, ///< Differential output -} csi_codec_output_mode_t; - -typedef enum { - CODEC_INPUT_SINGLE_ENDED, ///< Single-ended input - CODEC_INPUT_DIFFERENCE, ///< Differential input -} csi_codec_input_mode_t; - -typedef struct { - uint32_t sample_rate; ///< Input data sample rate - uint32_t bit_width; ///< Input data sample width - csi_codec_input_mode_t mode; ///< Input work mode - uint8_t *buffer; ///< The buffer used to save audio data - uint32_t buffer_size; ///< Input buffer size - uint32_t period; ///< When a peroid data is reached,the callback function is called - uint32_t sound_channel_num; ///< Number of soundtrack per channel -} csi_codec_input_config_t; - -typedef struct { - uint32_t sample_rate; ///< Output data sample rate - uint32_t bit_width; ///< Onput data sample width - csi_codec_output_mode_t mode; ///< Onput work mode - uint8_t *buffer; ///< The buffer used to save audio data - uint32_t buffer_size; ///< Output buffer size - uint32_t period; ///< When a peroid data is reached,the callback function is called - uint32_t sound_channel_num; ///< Number of soundchannel per channel -} csi_codec_output_config_t; - -/** - \brief Init the codec according to the specified - \param[in] codec Codec handle to operate - \param[in] idx Codec interface idx - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_init(csi_codec_t *codec, uint32_t idx); - -/** - \brief Codec uninit - \param[in] codec Codec handle to operate - \return None -*/ -void csi_codec_uninit(csi_codec_t *codec); - -/** - \brief Open a codec output channel - \param[in] codec Codec handle to operate - \param[in] ch Codec output channel handle - \param[in] ch_idx Codec output channel idx - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_output_open(csi_codec_t *codec, csi_codec_output_t *ch, uint32_t ch_idx); - -/** - \brief Config codec output channel - \param[in] ch Codec output channel handle - \param[in] config Codec channel param. \ref csi_codec_output_config_t - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_output_config(csi_codec_output_t *ch, csi_codec_output_config_t *config); - -/** - \brief Attach the callback handler to codec output - \param[in] ch Codec output channel handle - \param[in] cb Callback function - \param[in] arg User private param - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_output_attach_callback(csi_codec_output_t *ch, void *callback, void *arg); - -/** - \brief Detach the callback handler - \param[in] ch Codec output channel handle - \return None -*/ -void csi_codec_output_detach_callback(csi_codec_output_t *ch); - -/** - \brief Close a codec output channel - \param[in] ch Codec output channel handle - \return error code \ref csi_error_t -*/ -void csi_codec_output_close(csi_codec_output_t *ch); - -/** - \brief Link DMA channel to codec output channel - \param[in] ch Codec output channel handle - \param[in] dma The codec output DMA channel handle, when it is NULL means to unlink the channel - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_output_link_dma(csi_codec_output_t *ch, csi_dma_ch_t *dma); - -/** - \brief Send an amount of data to buffer in blocking mode - \param[in] ch The codec output channel - \param[in] data Pointer to send data buffer - \param[in] size Send data size - \return the num of data witch is send successful -*/ -uint32_t csi_codec_output_write(csi_codec_output_t *ch, const void *data, uint32_t size); - -/** - \brief Send data to the buffer with asynchronous sending - The data is first written to the buffer and then output through the codec interface - This function does not block, and the return value is the number - Of data that was successfully written to the buffer - \param[in] ch The codec output channel - \param[in] data Pointer to send data buffer - \param[in] size Send data size - \return The data size that send to buffer -*/ -uint32_t csi_codec_output_write_async(csi_codec_output_t *ch, const void *data, uint32_t size); - -/** - \brief Start sending data from the buffer - \param[in] ch Codec output channel handle - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_output_start(csi_codec_output_t *ch); - -/** - \brief Stop sending data from the buffer - \param[in] ch Codec output channel handle - \return None -*/ -void csi_codec_output_stop(csi_codec_output_t *ch); - -/** - \brief Pause sending data from the buffer - \param[in] ch Codec output channel handle - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_output_pause(csi_codec_output_t *ch); - -/** - \brief Resume sending data from the buffer - \param[in] ch Codec output channel handle - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_output_resume(csi_codec_output_t *ch); - -/** - \brief Get output-buffer free space - \param[in] ch Codec output channel handle - \return Buffer free space (bytes) -*/ -uint32_t csi_codec_output_buffer_avail(csi_codec_output_t *ch); - -/** - \brief Get used space of output-buffer - \param[in] ch Codec output channel handle - \return Buffer free space (bytes) -*/ -uint32_t csi_codec_output_buffer_remain(csi_codec_output_t *ch); - -/** - \brief Reset the buf, discard all data in the buffer - \param[in] ch Codec output channel handle - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_output_buffer_reset(csi_codec_output_t *ch); - -/** - \brief Mute codec ouput channel - \param[in] ch Codec output channel handle - \param[in] en True enable codec mute. false disable codec mute - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_output_mute(csi_codec_output_t *ch, bool enable); - -/** - \brief Set codec ouput channel digital gain - \param[in] ch Codec output channel handle - \param[in] val Gain val - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_output_digital_gain(csi_codec_output_t *ch, uint32_t val); - -/** - \brief Set codec ouput channel analog gain - \param[in] ch Codec output channel handle - \param[in] val Gain val - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_output_analog_gain(csi_codec_output_t *ch, uint32_t val); - -/** - \brief Set codec ouput channel mix gain - \param[in] ch Codec output channel handle - \param[in] val Gain val - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_output_mix_gain(csi_codec_output_t *ch, uint32_t val); - -/** - \brief Get codec output channel state - \param[in] ch Codec output channel handle - \param[out] state Channel state. \ref csi_state_t - \return channel state -*/ -csi_error_t csi_codec_output_get_state(csi_codec_output_t *ch, csi_state_t *state); - -/** - \brief Open a codec input channel - \param[in] codec Codec handle to operate - \param[in] ch Codec input channel handle - \param[in] ch_idx Codec input channel idx - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_input_open(csi_codec_t *codec, csi_codec_input_t *ch, uint32_t ch_idx); - -/** - \brief Config codec input channel - \param[in] ch Codec input channel handle - \param[in] config Codec channel prarm. \ref csi_codec_input_config_t - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_input_config(csi_codec_input_t *ch, csi_codec_input_config_t *config); - -/** - \brief Attach the callback handler to codec output - \param[in] ch Codec input channel handle - \param[in] cb Callback function - \param[in] arg User private param for event callback - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_input_attach_callback(csi_codec_input_t *ch, void *callback, void *arg); - -/** - \brief Detach the callback handler - \param[in] ch Codec input channel handle - \return None -*/ -void csi_codec_input_detach_callback(csi_codec_input_t *ch); - -/** - \brief Close a codec input channel - \param[in] ch Codec input channel handle - \return None -*/ -void csi_codec_input_close(csi_codec_input_t *ch); - -/** - \brief Link DMA channel to codec input channel - \param[in] ch Codec input channel handle - \param[in] dma The codec input DMA channel handle, when it is NULL means to unlink the channel - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_input_link_dma(csi_codec_input_t *ch, csi_dma_ch_t *dma); - -/** - \brief Read an amount of data in blocking mode - \param[in] ch Codec input channel handle - \param[in] data Pointer to receive data buffer - \param[in] size Receive data size - \return The size of data read successfully -*/ -uint32_t csi_codec_input_read(csi_codec_input_t *ch, void *data, uint32_t size); - -/** - \brief Read data from the buffer - using asynchronous receive - this function read data from the buffer, returns the number of successful receive - and returns 0 if there is no data in the buffer - \param[in] ch Codec input channel handle - \param[in] data Pointer to receive data buffer - \param[in] size Receive data size - \return The size of data read successfully -*/ -uint32_t csi_codec_input_read_async(csi_codec_input_t *ch, void *data, uint32_t size); - -/** - \brief Start receive data to the buffer - \param[in] ch Codec input channel handle - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_input_start(csi_codec_input_t *ch); - -/** - \brief Stop receive data - \param[in] ch Codec input channel handle - \return None -*/ -void csi_codec_input_stop(csi_codec_input_t *ch); - -/** - \brief Reset the buf, discard all data in the buffer - \param[in] ch Codec input channel handle - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_input_buffer_reset(csi_codec_input_t *ch); - -/** - \brief Get input-buffer free space - \param[in] ch Codec input channel handle - \return Buffer free space (bytes) -*/ -uint32_t csi_codec_input_buffer_avail(csi_codec_input_t *ch); - -/** - \brief Get used space of input-buffer - \param[in] ch Codec input channel handle - \return Buffer free space (bytes) -*/ -uint32_t csi_codec_input_buffer_remain(csi_codec_input_t *ch); - -/** - \brief Mute codec input channel - \param[in] ch Codec input channel handle - \param[in] en True enable codec mute. false disable codec mute - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_input_mute(csi_codec_input_t *ch, bool en); - -/** - \brief Set codec input channel digital gain - \param[in] ch Codec input channel handle - \param[in] val Gain val - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_input_digital_gain(csi_codec_input_t *ch, uint32_t val); - -/** - \brief Set codec input channel analog gain - \param[in] ch Codec input channel handle - \param[in] val Gain val - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_input_analog_gain(csi_codec_input_t *ch, uint32_t val); - -/** - \brief Set codec input channel mix gain - \param[in] ch Codec input channel handle - \param[in] val Gain val - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_input_mix_gain(csi_codec_input_t *ch, uint32_t val); - -/** - \brief Get codec input channel state - \param[in] ch Codec input channel handle - \param[out] state Channel state - \return Channel state -*/ -csi_error_t csi_codec_input_get_state(csi_codec_input_t *ch, csi_state_t *state); - -/** - \brief Enable codec power manage - \param[in] codec Codec handle to operate - \return error code \ref csi_error_t -*/ -csi_error_t csi_codec_enable_pm(csi_codec_t *codec); - -/** - \brief Disable codec power manage - \param[in] codec Codec handle to operate - \return None -*/ -void csi_codec_disable_pm(csi_codec_t *codec); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_CODEC_H_ */ - diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/crc.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/crc.h deleted file mode 100755 index 2fbd43db..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/crc.h +++ /dev/null @@ -1,136 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file crc.h - * @brief Header File for CRC Driver - * @version V1.0 - * @date 02. June 2020 - * @model crc - ******************************************************************************/ - -#ifndef _DRV_CRC_H_ -#define _DRV_CRC_H_ - -#include <stdint.h> -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Compute the CRC-7 checksum of a buffer. - * - * See JESD84-A441. Used by the MMC protocol. Uses 0x09 as the - * polynomial with no reflection. The CRC is left - * justified, so bit 7 of the result is bit 6 of the CRC. - * init = 0; poly = 0x09 refin = 0 refout = 0 xorout = 0 - * \param[in] crc Crc init value or crc immediate result - * \param[in] data Data buf to be calculate - * \param[in] size Data size - * - * \return The computed CRC7 value - */ -uint8_t csi_crc7_be(uint8_t crc, uint8_t *data, uint32_t size); - -/** - * \brief Compute the CRC-8 checksum of a buffer. - * init = 0 or 0xff; poly = 0x07 refin = 0 refout = 0 xorout = 0 - * \param[in] crc Crc init value or crc immediate result - * \param[in] data Data buf to be calculate - * \param[in] size Data size - * \return The computed CRC8 value - */ -uint8_t csi_crc8(uint8_t crc, uint8_t *data, size_t size); - -/** - * \brief Compute the CRC-8 checksum of a buffer. - * init = 0; poly = 0x31 refin = 1 refout = 1 xorout = 0 - * \param[in] crc Crc init value or crc immediate result - * \param[in] data Data buf to be calculate - * \param[in] size Data size - * \return The computed CRC8 value - */ -uint8_t csi_crc8_maxim(uint8_t crc, uint8_t *data, size_t size); - -/** - * \brief Compute the CRC-16 checksum of a buffer. - * init = 0 or 0xffff; poly = 0x8005 refin = 1 refout = 1 xorout = 0 - * \param[in] crc Crc init value or crc immediate result - * \param[in] data Data buf to be calculate - * \param[in] size Data size - * \return The computed CRC16 without xorout - */ -uint16_t csi_crc16(uint16_t crc, uint8_t *data, uint32_t size); - -/** - * \brief Compute the CRC-16 checksum of a buffer. - * init = 0; poly = 0x1021 refin = 1 refout = 1 xorout = 0 - * \param[in] crc Crc init value or crc immediate result - * \param[in] data Data buf to be calculate - * \param[in] size Data size - * \return The computed CRC16 without xorout - */ -uint16_t csi_crc16_ccitt(uint16_t crc, uint8_t *data, uint32_t size); - -/** - * \brief Compute the CRC-16 checksum of a buffer. - * init = 0; poly = 0x3d65 refin = 1 refout = 1 xorout = 0xffff - * \param[in] init_value Crc init value - * \param[in] data Data buf to be calculate - * \param[in] size Data size - * \return The computed CRC16 with xorout - */ -uint16_t csi_crc16_dnp(uint16_t init_value, uint8_t *data, uint32_t size); - -/** - * \brief Compute the CRC-16 checksum of a buffer. - * init = 0; poly = 0x1021 refin = 0 refout = 0 xorout = 0 - * \param[in] crc Crc init value or crc immediate result - * \param[in] data Data buf to be calculate - * \param[in] size Data size - * \return The computed CRC16 without xorout - */ -uint16_t csi_crc16_itu(uint16_t crc, uint8_t *data, uint32_t size); - -/** - * \brief Compute the CRC-32 checksum of a buffer.Little-endian by bit. - * init = 0; poly = 0xEDB88320 refin = 0 refout = 0 xorout = 0 - * \param[in] crc Crc init value or crc immediate result - * \param[in] data Data buf to be calculate - * \param[in] size Data size - * \return The computed CRC32 without xorout - */ -uint32_t csi_crc32_le(uint32_t crc, uint8_t *data, uint32_t size); - -/** - * \brief Compute the CRC-32 checksum of a buffer.Big-endian by bit. - * init = 0; poly = 0x04C11DB7 refin = 0 refout = 0 xorout = 0 - * \param[in] crc Crc init value or crc immediate result - * \param[in] data Data buf to be calculate - * \param[in] size Data size - * \return The computed CRC32 without xorout - */ -uint32_t csi_crc32_be(uint32_t crc, uint8_t *data, uint32_t size); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_CRC_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/des.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/des.h deleted file mode 100755 index 2b0540ea..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/des.h +++ /dev/null @@ -1,174 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/des.h - * @brief Header File for DES Driver - * @version V1.0 - * @date 24. Oct 2022 - * @model des - ******************************************************************************/ - -#ifndef _DRV_DES_H_ -#define _DRV_DES_H_ - -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** -\brief DES key-len-bits type -*/ -typedef enum { - DES_KEY_LEN_BITS_64 = 0, /*64 Data bits*/ - DES_KEY_LEN_BITS_128, /*128 Data bits*/ - DES_KEY_LEN_BITS_192, /*192 Data bits*/ -} csi_des_key_bits_t; - -/** -\brief DES Ctrl Block -*/ -typedef struct { - csi_dev_t dev; - void *priv; -} csi_des_t; - -/** - \brief Initialize DES interface. Initializes the resources needed for the DES interface - \param[in] des Handle to operate - \param[in] idx Device id - \return Error code \ref csi_error_t -*/ -csi_error_t csi_des_init(csi_des_t *des, uint32_t idx); - -/** - \brief De-initialize DES interface. Stops operation and releases the software resources used by the interface - \param[in] des Dandle to operate - \return None -*/ -void csi_des_uninit(csi_des_t *des); - -/** - \brief Set encrypt key - \param[in] des Handle to operate - \param[in] key Pointer to the key buf - \param[in] key_len Pointer to \ref csi_des_key_bits_t - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_des_set_encrypt_key(csi_des_t *des, void *key, csi_des_key_bits_t key_len); - -/** - \brief Set decrypt key - \param[in] des Handle to operate - \param[in] key Pointer to the key buf - \param[in] key_len Pointer to \ref csi_des_key_bits_t - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_des_set_decrypt_key(csi_des_t *des, void *key, csi_des_key_bits_t key_len); - -/** - \brief DES ecb encrypt - \param[in] des Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_des_ecb_encrypt(csi_des_t *des, void *in, void *out, uint32_t size); - -/** - \brief DES ecb decrypt - \param[in] des Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_des_ecb_decrypt(csi_des_t *des, void *in, void *out, uint32_t size); - -/** - \brief DES cbc encrypt - \param[in] des Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_des_cbc_encrypt(csi_des_t *des, void *in, void *out, uint32_t size, void *iv) ; - -/** - \brief DES cbc decrypt - \param[in] des Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_des_cbc_decrypt(csi_des_t *des, void *in, void *out, uint32_t size, void *iv); - -/** - \brief TDES ecb encrypt - \param[in] des Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_tdes_ecb_encrypt(csi_des_t *des, void *in, void *out, uint32_t size); - -/** - \brief TDES ecb decrypt - \param[in] des Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_tdes_ecb_decrypt(csi_des_t *des, void *in, void *out, uint32_t size); - -/** - \brief TDES cbc encrypt - \param[in] des Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_tdes_cbc_encrypt(csi_des_t *des, void *in, void *out, uint32_t size, void *iv) ; - -/** - \brief TDES cbc decrypt - \param[in] des Handle to operate - \param[in] in Pointer to the source data - \param[out] out Pointer to the result data - \param[in] size The source data size - \param[in] iv Init vector - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_tdes_cbc_decrypt(csi_des_t *des, void *in, void *out, uint32_t size, void *iv); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_DES_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/drv_fft.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/drv_fft.h deleted file mode 100755 index 76330849..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/drv_fft.h +++ /dev/null @@ -1,83 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv_fft.h - * @brief header file for gpio driver - * @version V1.0 - * @date 11. Nov 2017 - * @model fft - ******************************************************************************/ - -#ifndef _CSI_FFT_H_ -#define _CSI_FFT_H_ - - -#include <stdint.h> -#include <stdbool.h> -#include <stddef.h> -//#include <drv_common.h> - -#ifdef __cplusplus - extern "C" { -#endif - -typedef enum { - // 512-point FFT - CSKY_MCA_FFT_LEN_512 = 0x1, - // 256-point FFT - CSKY_MCA_FFT_LEN_256 = 0x2, - // 128-point FFT - CSKY_MCA_FFT_LEN_128 = 0x4, - // 64-point FFT - CSKY_MCA_FFT_LEN_64 = 0x8, - // 32-point FFT - CSKY_MCA_FFT_LEN_32 = 0x10, - // 16-point FFT - CSKY_MCA_FFT_LEN_16 = 0x20, -} csky_mca_fft_len_t; - -/* 8-bit fixed-point numeric type in user-defined format */ -typedef int8_t fxp8_t; -/* 16-bit fixed-point numeric type in user-defined format */ -typedef int16_t fxp16_t; -/* 24-bit fixed-point numeric type in user-defined format */ -typedef int32_t fxp24_t; -/* 32-bit fixed-point numeric type in user-defined format */ -typedef int32_t fxp32_t; -/* 64-bit fixed-point numeric type in user-defined format */ -typedef int64_t fxp64_t; - -/* 8-bit fixed-point numeric type in 1.0.7 format */ -typedef fxp8_t q7_t; -/* 16-bit fixed-point numeric type in 1.0.15 format */ -typedef fxp16_t q15_t; -/* 32-bit fixed-point numeric type in 1.15.16 format */ -typedef fxp32_t q16_t; - -void csky_mca_rfft_fxp32(csky_mca_fft_len_t fft_len, const fxp32_t *input, size_t input_size, fxp32_t *output); -void csky_mca_cfft_fxp32(csky_mca_fft_len_t fft_len, const fxp32_t *input, fxp32_t *output); -void csky_mca_rifft_fxp32(csky_mca_fft_len_t fft_len, const fxp32_t *input, fxp32_t *output); -void csky_mca_cifft_fxp32(csky_mca_fft_len_t fft_len, const fxp32_t *input, fxp32_t *output); -void csky_mca_power_spectrum_fxp32(csky_mca_fft_len_t fft_len, const fxp32_t *input, size_t input_size, fxp64_t *output); - -#ifdef __cplusplus -} -#endif - -#endif /* _CSI_FFT_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/ecdh.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/ecdh.h deleted file mode 100755 index 5e9acf78..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/ecdh.h +++ /dev/null @@ -1,92 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/ecdh.h - * @brief Header File for ECDH Driver - * @version V1.0 - * @date 9. May 2023 - * @model ecdh - ******************************************************************************/ - -#ifndef _DRV_ECDH_H_ -#define _DRV_ECDH_H_ - -#include <drv/common.h> -#include <drv/ecdsa.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** -\brief ECDH Ctrl Block -*/ -typedef struct { - csi_dev_t dev; - void *priv; -} csi_ecdh_t; - -/** - \brief Initialize ECDH interface. Initializes the resources needed for the ECDH interface - \param[in] ecdh Handle to operate - \param[in] idx Device id - \return Error code \ref csi_error_t -*/ -csi_error_t csi_ecdh_init(csi_ecdh_t *ecdh, uint32_t idx); - -/** - \brief De-initialize ECDH interface. Stops operation and releases the software resources used by the interface - \param[in] ecdh Dandle to operate - \return None -*/ -void csi_ecdh_uninit(csi_ecdh_t *ecdh); - -/** - \brief Load curve param to engin - \param[in] ecdh Handle to operate - \param[in] type Pointer to \ref csi_curve_type_t - \return Error code \ref csi_error_t -*/ -csi_error_t csi_ecdh_load_curve(csi_ecdh_t *ecdh, csi_curve_type_t type); - -/** - \brief ECDH generate key pair - \param[in] ecdh Handle to operate - \param[out] prikey Pointer to the private key buf - \param[out] pubkey Pointer to the public key buf - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_ecdh_gen_keypair(csi_ecdh_t *ecdh, uint8_t *prikey, uint8_t *pubkey); - -/** - \brief ECDH generate secret key - \param[in] ecdh Handle to operate - \param[in] prikey Pointer to the private key buf - \param[in] pubkey Pointer to the public key buf - \param[out] sk Pointer to the secret key buf - \param[out] sk_len The secret key length - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_ecdh_calc_secret(csi_ecdh_t *ecdh, const uint8_t *privkey, const uint8_t *pubkey, uint8_t *sk, uint32_t *sk_len); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_ECDH_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/ecdsa.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/ecdsa.h deleted file mode 100755 index 4c6d91a6..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/ecdsa.h +++ /dev/null @@ -1,112 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/ecdsa.h - * @brief Header File for ECDSA Driver - * @version V1.0 - * @date 9. May 2023 - * @model ecdsa - ******************************************************************************/ - -#ifndef _DRV_ECDSA_H_ -#define _DRV_ECDSA_H_ - -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** -\brief EC curve type -*/ -typedef enum { - CSI_CURVES_SECP256K1 = 0U, /* SECG curve over a 256 bit prime field */ - CSI_CURVES_SECP384R1, /* NIST/SECG curve over a 384 bit prime field */ - CSI_CURVES_SECP521R1, /* NIST/SECG curve over a 521 bit prime field */ - CSI_CURVES_BRAINPOOL256R1, /* RFC 5639 curve over a 256 prime field */ - CSI_CURVES_BRAINPOOL256T1, /* RFC 5639 curve over a 256 prime field */ - CSI_CURVES_BRAINPOOL512R1, /* RFC 5639 curve over a 512 prime field */ - CSI_CURVES_BRAINPOOL512T1, /* RFC 5639 curve over a 512 prime field */ -} csi_curve_type_t; - -/** -\brief ECDSA Ctrl Block -*/ -typedef struct { - csi_dev_t dev; - void *priv; -} csi_ecdsa_t; - -/** - \brief Initialize ECDSA interface. Initializes the resources needed for the ECDSA interface - \param[in] ecdsa Handle to operate - \param[in] idx Device id - \return Error code \ref csi_error_t -*/ -csi_error_t csi_ecdsa_init(csi_ecdsa_t *ecdsa, uint32_t idx); - -/** - \brief De-initialize ECDSA interface. Stops operation and releases the software resources used by the interface - \param[in] ecdsa Dandle to operate - \return None -*/ -void csi_ecdsa_uninit(csi_ecdsa_t *ecdsa); - -/** - \brief Load curve param to engin - \param[in] ecdsa Handle to operate - \param[in] type Pointer to \ref csi_curve_type_t - \return Error code \ref csi_error_t -*/ -csi_error_t csi_ecdsa_load_curve(csi_ecdsa_t *ecdsa, csi_curve_type_t type); - -/** - \brief Ecdsa Sign - \param[in] ecdsa Handle to operate - \param[in] prikey Pointer to the private key buf - \param[in] prikey_len The private key length - \param[in] dgst Pointer to the digest buf - \param[in] dgst_len The digest length - \param[out] sig Pointer to the signature buf - \param[out] sig_len The signature length - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_ecdsa_sign(csi_ecdsa_t *ecdsa, const uint8_t *prikey, uint32_t prikey_len, - const uint8_t *dgst, uint32_t dgst_len, uint8_t *sig, uint32_t *sig_len); - -/** - \brief Ecdsa Verify - \param[in] ecdsa Handle to operate - \param[in] pubkey Pointer to the public key buf - \param[in] prikey_len The public key length - \param[in] dgst Pointer to the digest buf - \param[in] dgst_len The digest length - \param[in] sig Pointer to the signature buf - \param[in] sig_len The signature length - \return Error code \ref Csi_error_t -*/ -csi_error_t csi_ecdsa_verify(csi_ecdsa_t *ecdsa, const uint8_t *pubkey, uint32_t pubkey_len, - const uint8_t *dgst, uint32_t gst_len, const uint8_t *sig, uint32_t sig_len); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_ECDSA_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/eflash.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/eflash.h deleted file mode 100755 index 8d6c41d0..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/eflash.h +++ /dev/null @@ -1,140 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file eflash.h - * @brief header file for eflash driver - * @version V1.0 - * @date 02. June 2017 - * @model eflash - ******************************************************************************/ -#ifndef _DRV_EFLASH_H_ -#define _DRV_EFLASH_H_ - -#include <stdint.h> -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** -\brief Flash information -*/ -typedef struct { - uint32_t flash_size; ///< Chip End address (start+size-1) - uint32_t sector_size; ///< Uniform sector size in bytes - uint32_t erased_value; ///< erased value -} csi_eflash_info_t; - -/** -\brief Flash Status -*/ -typedef struct { - uint32_t busy : 1; ///< Flash busy flag - uint32_t error : 1; ///< Read/Program/Erase error flag (cleared on start of next operation) -} eflash_status_t; - -/// definition for eflash handle. -typedef struct { - csi_dev_t dev; - void *arg; - csi_eflash_info_t eflashinfo; - uint16_t prog; - uint16_t erase; - void *priv; -} csi_eflash_t; - -// Function documentation - -/** - \brief Initialize EFLASH Interface. 1. Initializes the resources needed for the EFLASH interface 2.registers event callback function - \param[in] eflash eflash handle to operate. - \param[in] idx device id - \param[in] arg User can define it by himself as callback's param - \return error code -*/ -csi_error_t csi_eflash_init(csi_eflash_t *eflash, int32_t idx, void *arg); - -/** - \brief De-initialize EFLASH Interface. stops operation and releases the software resources used by the interface - \param[in] eflash eflash handle to operate. - \return error code -*/ -csi_error_t csi_eflash_uninit(csi_eflash_t *eflash); - -/** - \brief Read data from Flash. - \param[in] eflash eflash handle to operate. - \param[in] offset Data address. - \param[out] data Pointer to a buffer storing the data read from Flash. - \param[in] size Number of data items to read. - \return error code -*/ -csi_error_t csi_eflash_read(csi_eflash_t *eflash, uint32_t offset, void *data, uint32_t size); - -/** - \brief Program data to Flash. - \param[in] eflash eflash handle to operate. - \param[in] offset Data address. - \param[in] data Pointer to a buffer containing the data to be programmed to Flash. - \param[in] size Number of data items to program. - \return error code -*/ -csi_error_t csi_eflash_program(csi_eflash_t *eflash, uint32_t offset, const void *data, uint32_t size); - -/** - \brief Erase Flash Sector. - \param[in] eflash eflash handle to operate. - \param[in] offset flash address, flash address need sector size aligned - \param[in] size erase size - \return error code -*/ -csi_error_t csi_eflash_erase(csi_eflash_t *eflash, uint32_t offset,uint32_t size); - -/** - \brief Erase whole flash - \param[in] eflash eflash handle to operate. - \return error code -*/ -csi_error_t csi_eflash_erase_chip(csi_eflash_t *eflash); - -/** - \brief Get Flash information. - \param[in] eflash eflash handle to operate. -*/ -void csi_eflash_dev_info(csi_eflash_t *eflash,csi_eflash_info_t *eflash_info); - -/** - \brief enable eflash power manage - \param[in] eflash eflash handle to operate. - \return error code -*/ -csi_error_t csi_eflash_enable_pm(csi_eflash_t *eflash); - -/** - \brief disable eflash power manage - \param[in] eflash eflash handle to operate. -*/ -void csi_eflash_disable_pm(csi_eflash_t *eflash); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_EFLASH_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/efuse.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/efuse.h deleted file mode 100755 index 2c697074..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/efuse.h +++ /dev/null @@ -1,93 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/efuse.h - * @brief Header File for EFUSE Driver - * @version V1.0 - * @date 22. Mar 2020 - * @model efuse - ******************************************************************************/ -#ifndef _DEV_EFUSEC_H_ -#define _DEV_EFUSEC_H_ - -#include <stdint.h> -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - uint32_t start; ///< Efuse start address - uint32_t end; ///< Efuse end address - uint32_t size; ///< Efuse size -} csi_efuse_info_t; - -typedef struct { - csi_dev_t dev; - csi_efuse_info_t info; -} csi_efuse_t; - -/** - \brief Initialize EFUSEC Interface. 1. Initializes the resources needed for the EFUSEC interface - \param[in] idx Device id - \return Error code -*/ -csi_error_t csi_efuse_init(csi_efuse_t *efuse, int32_t idx); - -/** - \brief De-initialize EFUSEC Interface. stops operation and releases the software resources used by the interface - \param[in] efuse Efuse efuse to operate. - \return None -*/ -void csi_efuse_uninit(csi_efuse_t *efuse); - -/** - \brief Read data from Efuse. - \param[in] efuse Efuse handle to operate. - \param[in] addr Data address. - \param[out] data Pointer to a buffer storing the data read from Efuse. - \param[in] size Number of data items to read. - \return Number of data items read or error code -*/ -int32_t csi_efuse_read(csi_efuse_t *efuse, uint32_t addr, void *data, uint32_t size); - -/** - \brief Program data to Efuse. - \param[in] efuse Efuse handle to operate. - \param[in] addr Data address. - \param[in] data Pointer to a buffer containing the data to be programmed to Efuse. - \param[in] cnt Number of data items to program. - \return number of data items programmed or error code -*/ -int32_t csi_efuse_program(csi_efuse_t *efuse, uint32_t addr, const void *data, uint32_t size); - -/** - \brief Get Efuse information. - \param[in] efuse Efuse handle to operate. - \param[out] info Efuse info \refs csi_efuse_info_t. - \return Error code -*/ -csi_error_t csi_efuse_get_info(csi_efuse_t *efuse, csi_efuse_info_t *info); - -#ifdef __cplusplus -} -#endif - -#endif /* _CSI_EFUSEC_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/etb.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/etb.h deleted file mode 100755 index 20dcfac7..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/etb.h +++ /dev/null @@ -1,102 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv_etb.h - * @brief header file for event trigger driver - * @version V1.0 - * @date 27. octorber 2017 - * @model etb - ******************************************************************************/ - -#ifndef _DRV_ETB_H_ -#define _DRV_ETB_H_ - -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - ETB_HARDWARE_TRIG = 0, ///< etb channel inout is hardware trigger. - ETB_SOFTWARE_TRIG ///< etb channel inout is software trigger. -} csi_etb_trig_mode_t; - -typedef enum { - ETB_CH_ONE_TRIGGER_ONE = 0, ///< one device trig one deivce - ETB_CH_ONE_TRIGGER_MORE, ///< one device trig two for more device - ETB_CH_MORE_TRIGGER_ONE ///< two or more device trig one deivce -} csi_etb_ch_type_t; - -typedef struct { - uint8_t src_ip; ///< a specific number represent a location in an source trigger location map to trigger other ip(s). - uint8_t dst_ip; ///< a specific number represent an location in an dest trigger map to wait signal(s) from source ip(s) or location(s). - csi_etb_trig_mode_t trig_mode; ///< the input source is hardware trigger or software trigger. - csi_etb_ch_type_t ch_type; ///< channel type -} csi_etb_config_t; - -/** - \brief Init the etb device - \return error code -*/ -csi_error_t csi_etb_init(void); - -/** - \brief Uninit the etb device - \return none -*/ -void csi_etb_uninit(void); - -/** - \brief alloc an etb channel - \param[in] ch_mode etb channel work mode - \return channel id or CSI_ERROR -*/ -int32_t csi_etb_ch_alloc(csi_etb_ch_type_t ch_type); - -/** - \brief free an etb channel - \param[in] ch_id etb channel work mode - \return none -*/ -void csi_etb_ch_free(int32_t ch_id); - -/** - \brief config etb channel - \param[in] ch_id etb channel id - \param[in] config the config structure for etb channel - \return csi error code -*/ -csi_error_t csi_etb_ch_config(int32_t ch_id, csi_etb_config_t *config); - -/** - \brief start an etb channel - \param[in] ch_id etb channel id - \return none -*/ -void csi_etb_ch_start(int32_t ch_id); - -/** - \brief stop an etb channel - \param[in] etb etb channel id - \return none -*/ -void csi_etb_ch_stop(int32_t ch_id); - -#endif /* _CSI_ETB_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/eth.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/eth.h deleted file mode 100644 index 3a2aedb4..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/eth.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright (C) 2016 CSI Project. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef _CSI_NET_H_ -#define _CSI_NET_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define CSI_ETH_VERSION_MAJOR_MINOR(major,minor) (((major) << 8) | (minor)) - -/** -\brief Driver Version -*/ -typedef struct csi_driver_version { - uint16_t api; ///< API version - uint16_t drv; ///< Driver version -} csi_drv_version_t; - -/* General return codes */ -#define CSI_ETH_OK 0 ///< Operation succeeded -#define CSI_ETH_ERROR CSI_DRV_ERRNO_ETH_BASE+1 ///< Unspecified error -#define CSI_ETH_ERROR_BUSY CSI_DRV_ERRNO_ETH_BASE+2 ///< Driver is busy -#define CSI_ETH_ERROR_TIMEOUT CSI_DRV_ERRNO_ETH_BASE+3 ///< Timeout occurred -#define CSI_ETH_ERROR_UNSUPPORTED CSI_DRV_ERRNO_ETH_BASE+4 ///< Operation not supported -#define CSI_ETH_ERROR_PARAMETER CSI_DRV_ERRNO_ETH_BASE+5 ///< Parameter error -#define CSI_ETH_ERROR_SPECIFIC CSI_DRV_ERRNO_ETH_BASE+6 ///< Start of driver specific errors - -/** -\brief General power states -*/ -typedef enum eth_power_state { - CSI_ETH_POWER_OFF, ///< Power off: no operation possible - CSI_ETH_POWER_LOW, ///< Low Power mode: retain state, detect and signal wake-up events - CSI_ETH_POWER_FULL ///< Power on: full operation at maximum performance -} eth_power_state_t; - -/** -\brief Ethernet Media Interface type -*/ -#define CSI_ETH_INTERFACE_MII (0) ///< Media Independent Interface (MII) -#define CSI_ETH_INTERFACE_RMII (1) ///< Reduced Media Independent Interface (RMII) -#define CSI_ETH_INTERFACE_SMII (2) ///< Serial Media Independent Interface (SMII) - -/** -\brief Ethernet link speed -*/ -#define CSI_ETH_SPEED_10M (0) ///< 10 Mbps link speed -#define CSI_ETH_SPEED_100M (1) ///< 100 Mbps link speed -#define CSI_ETH_SPEED_1G (2) ///< 1 Gpbs link speed - -/** -\brief Ethernet duplex mode -*/ -#define CSI_ETH_DUPLEX_HALF (0) ///< Half duplex link -#define CSI_ETH_DUPLEX_FULL (1) ///< Full duplex link - -/** -\brief Ethernet auto-negotiation -*/ -#define CSI_ETH_AUTONEG_DISABLE (0) ///< Disable auto-negotiation -#define CSI_ETH_AUTONEG_ENABLE (1) ///< Enable auto-negotiation - -/** -\brief Ethernet link state -*/ -typedef enum eth_link_state { - ETH_LINK_DOWN, ///< Link is down - ETH_LINK_UP ///< Link is up -} eth_link_state_t; - -/** -\brief Ethernet link information -*/ -typedef volatile struct eth_link_info { - uint32_t speed : 2; ///< Link speed: 0= 10 MBit, 1= 100 MBit, 2= 1 GBit - uint32_t duplex : 1; ///< Duplex mode: 0= Half, 1= Full - uint32_t autoneg : 1; ///< Set the interface to Auto Negotiation mode of transmission parameters - uint32_t loopback : 1; ///< Set the interface into a Loop-back test mode - uint32_t isolation : 1; ///< Set to indicate electrical isolation of PHY interface from MII/RMII interface - uint32_t reserved : 26; -} eth_link_info_t; - -/** -\brief Ethernet MAC Address -*/ -typedef struct eth_mac_addr { - uint8_t b[6]; ///< MAC Address (6 bytes), MSB first -} eth_mac_addr_t; - -#ifdef __cplusplus -} -#endif - -#endif /* CSI_NET_H_ */ - diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/eth_mac.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/eth_mac.h deleted file mode 100644 index bc5757d2..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/eth_mac.h +++ /dev/null @@ -1,377 +0,0 @@ -/** - * Copyright (C) 2016 CSI Project. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _CSI_ETH_H_ -#define _CSI_ETH_H_ - -#include <stdbool.h> -#include "drv/eth.h" -#include "drv/eth_phy.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void *eth_mac_handle_t; - -#define MAX_FRAMELEN 1518 /* (note: maximum ethernet frame length would be 1518) */ - -#define CSI_ETH_MAC_API_VERSION CSI_DRIVER_VERSION_MAJOR_MINOR(2,1) /* API version */ - -#define _CSI_Driver_ETH_MAC_(n) Driver_ETH_MAC##n -#define CSI_Driver_ETH_MAC_(n) _CSI_Driver_ETH_MAC_(n) - -/****** Ethernet MAC Control Codes *****/ - -#define CSI_ETH_MAC_CONFIGURE (0x01) ///< Configure MAC; arg = configuration -#define CSI_ETH_MAC_CONTROL_TX (0x02) ///< Transmitter; arg: 0=disabled (default), 1=enabled -#define CSI_ETH_MAC_CONTROL_RX (0x03) ///< Receiver; arg: 0=disabled (default), 1=enabled -#define CSI_ETH_MAC_FLUSH (0x04) ///< Flush buffer; arg = CSI_ETH_MAC_FLUSH_... -#define CSI_ETH_MAC_SLEEP (0x05) ///< Sleep mode; arg: 1=enter and wait for Magic packet, 0=exit -#define CSI_ETH_MAC_VLAN_FILTER (0x06) ///< VLAN Filter for received frames; arg15..0: VLAN Tag; arg16: optional CSI_ETH_MAC_VLAN_FILTER_ID_ONLY; 0=disabled (default) -#define DRV_ETH_MAC_ADJUST_LINK (0x07) ///< Adjust MAC link state according to phy state; arg: phy handle -#define DRV_ETH_MAC_CONTROL_IRQ (0x08) ///< Interrupt request; arg: 0=disable, 1=enable - -/*----- Ethernet MAC Configuration -----*/ -#define CSI_ETH_MAC_SPEED_Pos 0 -#define CSI_ETH_MAC_SPEED_Msk (3UL << CSI_ETH_MAC_SPEED_Pos) -#define CSI_ETH_MAC_SPEED_10M (CSI_ETH_SPEED_10M << CSI_ETH_MAC_SPEED_Pos) ///< 10 Mbps link speed -#define CSI_ETH_MAC_SPEED_100M (CSI_ETH_SPEED_100M << CSI_ETH_MAC_SPEED_Pos) ///< 100 Mbps link speed -#define CSI_ETH_MAC_SPEED_1G (CSI_ETH_SPEED_1G << CSI_ETH_MAC_SPEED_Pos) ///< 1 Gpbs link speed -#define CSI_ETH_MAC_DUPLEX_Pos 2 -#define CSI_ETH_MAC_DUPLEX_Msk (1UL << CSI_ETH_MAC_DUPLEX_Pos) -#define CSI_ETH_MAC_DUPLEX_HALF (CSI_ETH_DUPLEX_HALF << CSI_ETH_MAC_DUPLEX_Pos) ///< Half duplex link -#define CSI_ETH_MAC_DUPLEX_FULL (CSI_ETH_DUPLEX_FULL << CSI_ETH_MAC_DUPLEX_Pos) ///< Full duplex link -#define CSI_ETH_MAC_LOOPBACK (1UL << 4) ///< Loop-back test mode -#define CSI_ETH_MAC_CHECKSUM_OFFLOAD_RX (1UL << 5) ///< Receiver Checksum offload -#define CSI_ETH_MAC_CHECKSUM_OFFLOAD_TX (1UL << 6) ///< Transmitter Checksum offload -#define CSI_ETH_MAC_ADDRESS_BROADCAST (1UL << 7) ///< Accept frames with Broadcast address -#define CSI_ETH_MAC_ADDRESS_MULTICAST (1UL << 8) ///< Accept frames with any Multicast address -#define CSI_ETH_MAC_ADDRESS_ALL (1UL << 9) ///< Accept frames with any address (Promiscuous Mode) - -/*----- Ethernet MAC Flush Flags -----*/ -#define CSI_ETH_MAC_FLUSH_RX (1UL << 0) ///< Flush Receive buffer -#define CSI_ETH_MAC_FLUSH_TX (1UL << 1) ///< Flush Transmit buffer - -/*----- Ethernet MAC VLAN Filter Flag -----*/ -#define CSI_ETH_MAC_VLAN_FILTER_ID_ONLY (1UL << 16) ///< Compare only the VLAN Identifier (12-bit) - - -/****** Ethernet MAC Frame Transmit Flags *****/ -#define CSI_ETH_MAC_TX_FRAME_FRAGMENT (1UL << 0) ///< Indicate frame fragment -#define CSI_ETH_MAC_TX_FRAME_EVENT (1UL << 1) ///< Generate event when frame is transmitted -#define CSI_ETH_MAC_TX_FRAME_TIMESTAMP (1UL << 2) ///< Capture frame time stamp - - -/****** Ethernet MAC Timer Control Codes *****/ -#define CSI_ETH_MAC_TIMER_GET_TIME (0x01) ///< Get current time -#define CSI_ETH_MAC_TIMER_SET_TIME (0x02) ///< Set new time -#define CSI_ETH_MAC_TIMER_INC_TIME (0x03) ///< Increment current time -#define CSI_ETH_MAC_TIMER_DEC_TIME (0x04) ///< Decrement current time -#define CSI_ETH_MAC_TIMER_SET_ALCSI (0x05) ///< Set alarm time -#define CSI_ETH_MAC_TIMER_ADJUST_CLOCK (0x06) ///< Adjust clock frequency; time->ns: correction factor * 2^31 - - -/** -\brief Ethernet MAC Time -*/ -typedef struct eth_mac_time { - uint32_t ns; ///< Nano seconds - uint32_t sec; ///< Seconds -} eth_mac_time_t; - - -/****** Ethernet MAC Event *****/ -#define CSI_ETH_MAC_EVENT_RX_FRAME (1UL << 0) ///< Frame Received -#define CSI_ETH_MAC_EVENT_TX_FRAME (1UL << 1) ///< Frame Transmitted -#define CSI_ETH_MAC_EVENT_WAKEUP (1UL << 2) ///< Wake-up (on Magic Packet) -#define CSI_ETH_MAC_EVENT_TIMER_ALCSI (1UL << 3) ///< Timer Alarm -#define CSI_ETH_MAC_EVENT_LINK_CHANGE (1UL << 4) ///< Link state - -typedef void (*eth_event_cb_t)(int32_t idx, uint32_t event); ///< Pointer to \ref eth_event_cb_t : Signal Ethernet Event. - -typedef enum { - FRAME_FILTER_RULE_POSITIVE_MATCHING = 0, /*!< Specifies that a filter should match a given pattern */ - FRAME_FILTER_RULE_NEGATIVE_MATCHING = 1, /*!< Specifies that a filter should NOT match a given pattern */ -} frame_filter_rule_t; - -/** -\brief Ethernet MAC Capabilities -*/ -typedef struct eth_capabilities { - uint32_t checksum_offload_rx_ip4 : 1; ///< 1 = IPv4 header checksum verified on receive - uint32_t checksum_offload_rx_ip6 : 1; ///< 1 = IPv6 checksum verification supported on receive - uint32_t checksum_offload_rx_udp : 1; ///< 1 = UDP payload checksum verified on receive - uint32_t checksum_offload_rx_tcp : 1; ///< 1 = TCP payload checksum verified on receive - uint32_t checksum_offload_rx_icmp : 1; ///< 1 = ICMP payload checksum verified on receive - uint32_t checksum_offload_tx_ip4 : 1; ///< 1 = IPv4 header checksum generated on transmit - uint32_t checksum_offload_tx_ip6 : 1; ///< 1 = IPv6 checksum generation supported on transmit - uint32_t checksum_offload_tx_udp : 1; ///< 1 = UDP payload checksum generated on transmit - uint32_t checksum_offload_tx_tcp : 1; ///< 1 = TCP payload checksum generated on transmit - uint32_t checksum_offload_tx_icmp : 1; ///< 1 = ICMP payload checksum generated on transmit - uint32_t media_interface : 2; ///< Ethernet Media Interface type - uint32_t mac_address : 1; ///< 1 = driver provides initial valid MAC address - uint32_t event_rx_frame : 1; ///< 1 = callback event generated - uint32_t event_tx_frame : 1; ///< 1 = callback event generated - uint32_t event_wakeup : 1; ///< 1 = wakeup event generated - uint32_t precision_timer : 1; ///< 1 = Precision Timer supported - uint32_t reserved : 15; ///< Reserved (must be zero) -} eth_capabilities_t; - -/** - * Structure describing a frame filter list item - */ -typedef struct { - uint32_t id; /*!< Unique identifier for a packet filter item */ - frame_filter_rule_t rule; /*!< Filter matches are either POSITIVE or NEGATIVE matching */ - uint16_t offset; /*!< Offset in bytes to start filtering (referenced to the start of the ethernet packet) */ - uint16_t mask_size; /*!< Size of the mask in bytes */ - uint8_t *mask; /*!< Pattern mask bytes to be ANDed with the pattern eg. "\xff00" (must be in network byte order) */ - uint8_t *pattern; /*!< Pattern bytes used to filter eg. "\x0800" (must be in network byte order) */ - bool enabled_status; /*!< When returned from mhd_get_packet_filters, indicates if the filter is enabled */ -} eth_frame_filter_t; - -struct eth_frame_filter_list { - struct eth_frame_filter_list *next; -}; - -typedef struct eth_frame_filter_list eth_frame_filter_list_t; - -typedef struct { - eth_event_cb_t cb_event; - eth_capabilities_t capabilities; -} eth_mac_priv_t; - -/** - \brief Get driver version. - \param[in] handle ethernet handle - \return ethernet version including chip version and driver version -*/ -csi_drv_version_t csi_eth_mac_get_version(eth_mac_handle_t handle); - -/** - \brief Get driver capabilities. - \param[in] idx device id - \return ethernet capabilities -*/ -eth_capabilities_t csi_eth_mac_get_capabilities(int32_t idx); - -/** - \brief This function is used to initialize Ethernet device and related resource, an event callback is registered. It is called when the middleware component like TCPIP starts operation. - \param[in] idx device id - \param[in] cb callback to handle ethernet event - \return return ethernet handle if success - */ -eth_mac_handle_t csi_eth_mac_initialize(int32_t idx, eth_event_cb_t cb_event); - -/** - \brief This function is used to de-initialize Ethernet device. It is called when the middleware component stops operation and releases the software resources used by the interface. - \param[in] handle ethernet handle - \return error code - */ -int32_t csi_eth_mac_uninitialize(eth_mac_handle_t handle); - -/** - \brief Connect phy device to mac device. - \param[in] handle_mac mac handle - \param[in] handle_phy phy handle -*/ -void csi_eth_mac_connect_phy(eth_mac_handle_t handle_mac, eth_phy_handle_t handle_phy); - -/** - \brief Control Ethernet MAC Device Power. - \param[in] handle ethernet handle - \param[in] state Power state - \return error code -*/ -int32_t csi_eth_mac_power_control(eth_mac_handle_t handle, eth_power_state_t state); - -/** - \brief Get Ethernet MAC Address. - \param[in] handle ethernet handle - \param[in] mac Pointer to address - \return error code -*/ -int32_t csi_eth_mac_get_macaddr(eth_mac_handle_t handle, eth_mac_addr_t *mac); - -/** - \brief Set Ethernet MAC Address. - \param[in] handle ethernet handle - \param[in] mac Pointer to address - \return error code -*/ -int32_t csi_eth_mac_set_macaddr(eth_mac_handle_t handle, const eth_mac_addr_t *mac); - -/** - \brief Configure Address Filter. - \param[in] handle ethernet handle - \param[in] addr Pointer to addresses - \param[in] num_addr Number of addresses to configure - \return error code -*/ -int32_t csi_eth_mac_set_addrfilter(eth_mac_handle_t handle, const eth_mac_addr_t *addr, uint32_t num_addr); - -/** - \brief Send Ethernet frame. - \param[in] handle ethernet handle - \param[in] frame Pointer to frame buffer with data to send - \param[in] len Frame buffer length in bytes - \param[in] flags Frame transmit flags (see CSI_ETH_MAC_TX_FRAME_...) - \return error code -*/ -int32_t csi_eth_mac_send_frame(eth_mac_handle_t handle, const uint8_t *frame, uint32_t len, uint32_t flags); - -/** - \brief Read data of received Ethernet frame. - \param[in] handle ethernet handle - \param[in] frame Pointer to frame buffer for data to read into - \param[in] len Frame buffer length in bytes - \return number of data bytes read or execution status - - value >= 0: number of data bytes read - - value < 0: error occurred, value is execution status as defined with execution_status -*/ -int32_t csi_eth_mac_read_frame(eth_mac_handle_t handle, uint8_t *frame, uint32_t len); - -/** - \brief Request data of received Ethernet frame. - csi_eth_mac_request_frame() and csi_eth_mac_release_frame() - must be called in pairs. - \param[in] handle ethernet handle - \param[in] frame Pointer to frame buffer pointer - \return number of data bytes read or execution status - - value >= 0: number of data bytes read - - value < 0: error occurred -*/ -int32_t csi_eth_mac_request_frame(eth_mac_handle_t handle, uint8_t **frame); - -/** - \brief Release current Ethernet frame. - csi_eth_mac_request_frame() and csi_eth_mac_release_frame() - must be called in pairs. - \param[in] handle ethernet handle - \return error code -*/ -int32_t csi_eth_mac_release_frame(eth_mac_handle_t handle); - -/** - \brief Get size of received Ethernet frame. - \param[in] handle ethernet handle - \return number of bytes in received frame -*/ -int32_t csi_eth_mac_get_rx_framesize(eth_mac_handle_t handle); - -/** - \brief Get time of received Ethernet frame. - \param[in] handle ethernet handle - \param[in] time Pointer to time structure for data to read into - \return error code -*/ -int32_t csi_eth_mac_get_rx_frametime(eth_mac_handle_t handle, eth_mac_time_t *time); - -/** - \brief Get time of transmitted Ethernet frame. - \param[in] handle ethernet handle - \param[in] time Pointer to time structure for data to read into - \return error code -*/ -int32_t csi_eth_mac_get_tx_frametime(eth_mac_handle_t handle, eth_mac_time_t *time); - -/** - \brief Control Ethernet Interface. - \param[in] handle ethernet handle - \param[in] control Operation - \param[in] arg Argument of operation (optional) - \return error code -*/ -int32_t csi_eth_mac_control(eth_mac_handle_t handle, uint32_t control, uint32_t arg); - -/** - \brief Control Precision Timer. - \param[in] handle ethernet handle - \param[in] control Operation - \param[in] time Pointer to time structure - \return error code -*/ -int32_t csi_eth_mac_control_time(eth_mac_handle_t handle, uint32_t control, eth_mac_time_t *time); - -/** - \brief Read Ethernet PHY Register through Management Interface. - \param[in] handle ethernet handle - \param[in] phy_addr 5-bit device address - \param[in] reg_addr 5-bit register address - \param[out] data Pointer where the result is written to - \return error code -*/ -int32_t csi_eth_mac_phy_read(eth_mac_handle_t handle, uint8_t phy_addr, uint8_t reg_addr, uint16_t *data); - -/** - \brief Write Ethernet PHY Register through Management Interface. - \param[in] handle ethernet handle - \param[in] phy_addr 5-bit device address - \param[in] reg_addr 5-bit register address - \param[in] data 16-bit data to write - \return error code -*/ -int32_t csi_eth_mac_phy_write(eth_mac_handle_t handle, uint8_t phy_addr, uint8_t reg_addr, uint16_t data); - -/** - \brief Callback function that signals a Ethernet Event. - \param[in] handle ethernet handle - \param[in] event event notification mask - \return none -*/ -void csi_eth_mac_signal_event(eth_mac_handle_t handle, uint32_t event); - -/** - \brief Add Frame Filter Setting with Filter ID. - \param[in] handle ethernet handle - \param[in] filter Pointer to filter setting - \return error code -*/ -int32_t csi_eth_mac_add_framefilter(eth_mac_handle_t handle, const eth_frame_filter_t *filter); - -/** - \brief Remove Frame Filter Setting. - \param[in] handle ethernet handle - \param[in] filter_id Frame Filter ID - \return error code -*/ -int32_t csi_eth_mac_remove_framefilter(eth_mac_handle_t handle, uint32_t filter_id); - -/** - \brief Enable/Disable Specified Frame Filter ID. - \param[in] handle ethernet handle - \param[in] filter_id Frame Filter ID - \param[in] en Enable or disable - \return error code -*/ -int32_t csi_eth_mac_en_framefilter(eth_mac_handle_t handle, uint32_t filter_id, bool en); - -/** - \brief Get frame filter table list. - \param[in] handle ethernet handle - \param[in] list frame filter table list - \param[in] count_out the count of filter setting added - \param[in] max_count max filter setting can be supported - \return error code -*/ -int32_t csi_eth_mac_get_framefilter(eth_mac_handle_t handle, eth_frame_filter_list_t *list, uint32_t *count_out, uint32_t max_count); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/eth_phy.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/eth_phy.h deleted file mode 100644 index 5ef87565..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/eth_phy.h +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Copyright (C) 2016 CSI Project. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _CSI_ETH_PHY_H_ -#define _CSI_ETH_PHY_H_ - -#include "drv/eth.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void *eth_phy_handle_t; - -#define CSI_ETH_PHY_API_VERSION CSI_ETH_VERSION_MAJOR_MINOR(2,1) /* API version */ - - -#define _CSI_Driver_ETH_PHY_(n) Driver_ETH_PHY##n -#define CSI_Driver_ETH_PHY_(n) _CSI_Driver_ETH_PHY_(n) - - -/****** Ethernet PHY Mode *****/ -#define CSI_ETH_PHY_SPEED_Pos 0 -#define CSI_ETH_PHY_SPEED_Msk (3UL << CSI_ETH_PHY_SPEED_Pos) -#define CSI_ETH_PHY_SPEED_10M (CSI_ETH_SPEED_10M << CSI_ETH_PHY_SPEED_Pos) ///< 10 Mbps link speed -#define CSI_ETH_PHY_SPEED_100M (CSI_ETH_SPEED_100M << CSI_ETH_PHY_SPEED_Pos) ///< 100 Mbps link speed -#define CSI_ETH_PHY_SPEED_1G (CSI_ETH_SPEED_1G << CSI_ETH_PHY_SPEED_Pos) ///< 1 Gpbs link speed -#define CSI_ETH_PHY_DUPLEX_Pos 2 -#define CSI_ETH_PHY_DUPLEX_Msk (1UL << CSI_ETH_PHY_DUPLEX_Pos) -#define CSI_ETH_PHY_DUPLEX_HALF (CSI_ETH_DUPLEX_HALF << CSI_ETH_PHY_DUPLEX_Pos) ///< Half duplex link -#define CSI_ETH_PHY_DUPLEX_FULL (CSI_ETH_DUPLEX_FULL << CSI_ETH_PHY_DUPLEX_Pos) ///< Full duplex link -#define CSI_ETH_PHY_AUTO_NEGOTIATE (1UL << 3) ///< Auto Negotiation mode -#define CSI_ETH_PHY_LOOPBACK (1UL << 4) ///< Loop-back test mode -#define CSI_ETH_PHY_ISOLATE (1UL << 5) ///< Isolate PHY from MII/RMII interface - -typedef int32_t (*csi_eth_phy_read_t)(uint8_t phy_addr, uint8_t reg_addr, uint16_t *data); ///< Read Ethernet PHY Register. -typedef int32_t (*csi_eth_phy_write_t)(uint8_t phy_addr, uint8_t reg_addr, uint16_t data); ///< Write Ethernet PHY Register. - -typedef struct { - csi_eth_phy_read_t phy_read; - csi_eth_phy_write_t phy_write; - eth_link_info_t link_info; -} eth_phy_priv_t; - -// Function documentation -/** - \brief Get driver version. - \param[in] handle ethernet phy handle - \return driver version -*/ -csi_drv_version_t csi_eth_phy_get_version(eth_phy_handle_t handle); - -/** - \brief Initialize Ethernet PHY Device. - \param[in] fn_read - \param[in] fn_write - \return ethernet phy handle -*/ -eth_phy_handle_t csi_eth_phy_initialize(csi_eth_phy_read_t fn_read, csi_eth_phy_write_t fn_write); - -/** - \brief De-initialize Ethernet PHY Device. - \param[in] handle ethernet phy handle - \return error code -*/ -int32_t csi_eth_phy_uninitialize(eth_phy_handle_t handle); - -/** - \brief Control Ethernet PHY Device Power. - \param[in] handle ethernet phy handle - \param[in] state Power state - \return error code -*/ -int32_t csi_eth_phy_power_control(eth_phy_handle_t handle, eth_power_state_t state); - -/** - \brief Set Ethernet Media Interface. - \param[in] handle ethernet phy handle - \param[in] interface Media Interface type - \return error code -*/ -int32_t csi_eth_phy_set_interface(eth_phy_handle_t handle, uint32_t interface); - -/** - \brief Set Ethernet PHY Device Operation mode. - \param[in] handle ethernet phy handle - \param[in] mode Operation Mode - \return error code -*/ -int32_t csi_eth_phy_set_mode(eth_phy_handle_t handle, uint32_t mode); - -/** - \brief Get Ethernet PHY Device Link state. - \param[in] handle ethernet phy handle - \return current link status \ref eth_link_state_t -*/ -eth_link_state_t csi_eth_phy_get_linkstate(eth_phy_handle_t handle); - -/** - \brief Get Ethernet PHY Device Link information. - \param[in] handle ethernet phy handle - \return current link parameters \ref eth_link_info_t -*/ -eth_link_info_t csi_eth_phy_get_linkinfo(eth_phy_handle_t handle); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/fft.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/fft.h deleted file mode 100755 index a3cd312b..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/fft.h +++ /dev/null @@ -1,87 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/fft.h - * @brief Header File for FFT Driver - * @version V1.0 - * @date 11. Nov 2020 - * @model fft - ******************************************************************************/ - -#ifndef _DRV_FFT_H_ -#define _DRV_FFT_H_ - -#include <stdint.h> -#include <stdbool.h> -#include <stddef.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - ///< 512-point FFT - CSKY_MCA_FFT_LEN_512 = 0x1, - ///< 256-point FFT - CSKY_MCA_FFT_LEN_256 = 0x2, - ///< 128-point FFT - CSKY_MCA_FFT_LEN_128 = 0x4, - ///< 64-point FFT - CSKY_MCA_FFT_LEN_64 = 0x8, - ///< 32-point FFT - CSKY_MCA_FFT_LEN_32 = 0x10, - ///< 16-point FFT - CSKY_MCA_FFT_LEN_16 = 0x20, -} csky_mca_fft_len_t; - -/* 8-bit fixed-point numeric type in user-defined format */ -typedef int8_t fxp8_t; - -/* 16-bit fixed-point numeric type in user-defined format */ -typedef int16_t fxp16_t; - -/* 24-bit fixed-point numeric type in user-defined format */ -typedef int32_t fxp24_t; - -/* 32-bit fixed-point numeric type in user-defined format */ -typedef int32_t fxp32_t; - -/* 64-bit fixed-point numeric type in user-defined format */ -typedef int64_t fxp64_t; - -/* 8-bit fixed-point numeric type in 1.0.7 format */ -typedef fxp8_t q7_t; - -/* 16-bit fixed-point numeric type in 1.0.15 format */ -typedef fxp16_t q15_t; - -/* 32-bit fixed-point numeric type in 1.15.16 format */ -typedef fxp32_t q16_t; - -void csky_mca_rfft_fxp32(csky_mca_fft_len_t fft_len, const fxp32_t *input, size_t input_size, fxp32_t *output); -void csky_mca_cfft_fxp32(csky_mca_fft_len_t fft_len, const fxp32_t *input, fxp32_t *output); -void csky_mca_rifft_fxp32(csky_mca_fft_len_t fft_len, const fxp32_t *input, fxp32_t *output); -void csky_mca_cifft_fxp32(csky_mca_fft_len_t fft_len, const fxp32_t *input, fxp32_t *output); -void csky_mca_power_spectrum_fxp32(csky_mca_fft_len_t fft_len, const fxp32_t *input, size_t input_size, fxp64_t *output); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_FFT_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/gpio_pin.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/gpio_pin.h deleted file mode 100755 index 1cb81fc3..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/gpio_pin.h +++ /dev/null @@ -1,144 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/gpio_pin.h - * @brief Header File for GPIO PIN Driver - * @version v1.0 - * @date 2020-06-28 - * @note Only one of gpio or gpio_pin interface can be selected - ******************************************************************************/ - -#ifndef _DRV_GPIO_PIN_H_ -#define _DRV_GPIO_PIN_H_ - -#include <soc.h> -#include <csi_core.h> -#include <stdint.h> -#include <stdbool.h> -#include <drv/common.h> -#include <drv/gpio.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \struct csi_gpio_pin_t - * \brief GPIO PIN control block - */ - -typedef struct csi_gpio_pin csi_gpio_pin_t; -struct csi_gpio_pin { - csi_gpio_t *gpio; - uint32_t pin_idx; - void (*callback)(csi_gpio_pin_t *pin, void *arg); - void *arg; -}; - -/** - \brief Initialize GPIO pin handle - \param[in] pin GPIO pin handle - \param[in] pin_name GPIO pin name - \return Error code -*/ -csi_error_t csi_gpio_pin_init(csi_gpio_pin_t *pin, pin_name_t pin_name); - -/** - \brief De-initialize GPIO pin - \param[in] pin GPIO pin handle - \return None -*/ -void csi_gpio_pin_uninit(csi_gpio_pin_t *pin); - -/** - \brief Attach the interrupt callback to the GPIO pin - \param[in] pin GPIO pin handle - \param[in] callback Callback function - \param[in] arg User param passed to callback - \return Error code -*/ -csi_error_t csi_gpio_pin_attach_callback(csi_gpio_pin_t *pin, void *callback, void *arg); - -/** - \brief Config pin direction - \param[in] pin GPIO pin handle - \param[in] dir \ref csi_gpio_dir_t - \return Error code -*/ -csi_error_t csi_gpio_pin_dir(csi_gpio_pin_t *pin, csi_gpio_dir_t dir); - -/** - \brief Config pin mode - \param[in] pin GPIO pin handle - \param[in] mode \ref csi_gpio_mode_t - \return Error code -*/ -csi_error_t csi_gpio_pin_mode(csi_gpio_pin_t *pin, csi_gpio_mode_t mode); - -/** - \brief Config pin irq params - \param[in] pin GPIO pin handle - \param[in] mode Interrupt trigger mode \ref csi_gpio_irq_mode_t - \return Error code -*/ -csi_error_t csi_gpio_pin_irq_mode(csi_gpio_pin_t *pin, csi_gpio_irq_mode_t mode); - -/** - \brief Enable or disable gpio pin interrupt - \param[in] pin GPIO pin handle - \param[in] enable 0:disable 1:enable - \return Error code -*/ -csi_error_t csi_gpio_pin_irq_enable(csi_gpio_pin_t *pin, bool enable); - -/** - \brief Set debounce of pin when pin configed as input - \param[in] pin GPIO pin handle - \param[in] enbale 0: disable 1:enable - \return Error code -*/ -csi_error_t csi_gpio_pin_debounce(csi_gpio_pin_t *pin, bool enable); - -/** - \brief Set one or zero to specified pin - \param[in] pin GPIO pin handle - \param[in] value Value to be set \ref csi_gpio_pin_state_t - \return None -*/ -void csi_gpio_pin_write(csi_gpio_pin_t *pin, csi_gpio_pin_state_t value); - -/** - \brief Toggle output pin value,ex.if previous value is 1, then output 0 - \param[in] pin GPIO pin handle - \return None -*/ -void csi_gpio_pin_toggle(csi_gpio_pin_t *pin); - -/** - \brief Get the value of specified GPIO pin - \param[in] pin GPIO port handle - \return gpio pin state, \ref csi_gpio_pin_state_t -*/ -csi_gpio_pin_state_t csi_gpio_pin_read(csi_gpio_pin_t *pin); - -#ifdef __cplusplus -} -#endif - -#endif /* _GPIO_PIN_H_*/ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/hmac.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/hmac.h deleted file mode 100644 index 1033306e..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/hmac.h +++ /dev/null @@ -1,122 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/****************************************************************************** - * @file drv/hmac.h - * @brief Header File for HMAC - * @version V1.0 - * @date 27. Apri 2023 - * @model hmac - ******************************************************************************/ -#ifndef _DRV_HMAC_H_ -#define _DRV_HMAC_H_ - -#include <drv/common.h> -#include <drv/dma.h> -#include <drv/sha.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/****** HMAC Event ******/ -typedef enum { - HMAC_EVENT_COMPLETE = 0U, /* Calculate completed */ - HMAC_EVENT_ERROR /* Calculate error */ -} csi_hmac_event_t; - -/****** HMAC Context ******/ -typedef struct { - csi_sha_mode_t mode; /* SHA mode */ - uint32_t total[2]; /* Number of bytes processed */ - uint8_t buffer[128]; /* Data block being processed */ -} csi_hmac_context_t; - -/****** HMAC Ctrl ******/ -typedef struct csi_hmac { - csi_dev_t dev; - void *priv; -}csi_hmac_t; - -/** - \brief Initialize MAC Interface. Initializes the resources needed for the MAC interface - \param[in] mac operate handle. - \param[in] idx index of mac - \return error code \ref csi_error_t -*/ -csi_error_t csi_hmac_init(csi_hmac_t *mac, uint32_t idx); - -/** - \brief De-initialize MAC Interface. stops operation and releases the software resources used by the interface - \param[in] mac mac handle to operate. - \return none -*/ -void csi_hmac_uninit(csi_hmac_t *mac); - -/** - \brief MAC set key function. - \param[in] mac mac handle to operate. - \param[in] key Pointer to the mac key. - \param[in] key_len Length of key. - \return error code \ref csi_error_t -*/ -csi_error_t csi_hmac_set_key(csi_hmac_t *mac, uint8_t *key, uint32_t key_len); - -/** - \brief MAC start operation function. - \param[in] mac mac handle to operate. - \param[in] context mac context pointer. - \param[in] mode sc_sha_mode_t. - \return error code \ref csi_error_t -*/ -csi_error_t csi_hmac_start(csi_hmac_t *mac, csi_hmac_context_t *context, csi_sha_mode_t mode); - -/** - \brief MAC start operation function. - \param[in] mac mac handle to operate. - \param[in] msg Pointer to the mac input message. - \param[in] msg_len Length of msg. - \return error code \ref csi_error_t -*/ -csi_error_t csi_hmac_update(csi_hmac_t *mac, csi_hmac_context_t *context, uint8_t *msg, uint32_t msg_len); - -/** - \brief MAC start operation function. - \param[in] mac mac handle to operate. - \param[out] out mac buffer, malloc by caller. - \param[out] out_len out mac length, - \return error code \ref csi_error_t -*/ -csi_error_t csi_hmac_finish(csi_hmac_t *mac, csi_hmac_context_t *context, uint8_t *out, uint32_t *out_len); - -/** - \brief MAC cacl operation function. - \param[in] mac mac handle to operate. - \param[in] mode sc_sha_mode_t. - \param[in] msg Pointer to the mac input message. - \param[in] msg_len Length of msg. - \param[out] out mac buffer, malloc by caller. - \param[out] out_len out mac length, - \return error code \ref csi_error_t -*/ -csi_error_t csi_hmac_calc(csi_hmac_t *mac, csi_sha_mode_t mode, uint8_t *msg, - uint32_t msg_len, uint8_t *out, uint32_t *out_len); -#ifdef __cplusplus -} -#endif - -#endif /* _SC_MAC_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/i2s.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/i2s.h deleted file mode 100755 index f783d21d..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/i2s.h +++ /dev/null @@ -1,397 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/i2s.h - * @brief header file for i2s driver - * @version V1.0 - * @date 16. Mar 2020 - * @model i2s - ******************************************************************************/ - -#ifndef _DRV_I2S_H_ -#define _DRV_I2S_H_ - -#include <stdint.h> -#include <stdbool.h> -#include <drv/common.h> -#include <drv/dma.h> -#include "drv/ringbuf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - I2S_MODE_MASTER, ///< I2s transmitter master mode - I2S_MODE_SLAVE, ///< I2s transmitter slave mode -} csi_i2s_mode_t; - -typedef enum { - I2S_PROTOCOL_I2S, ///< I2S protocol - I2S_PROTOCOL_MSB_JUSTIFIED, ///< MSB (left) justified protocol - I2S_PROTOCOL_LSB_JUSTIFIED, ///< LSB (right) justified protocol - I2S_PROTOCOL_PCM, ///< PCM protocol -} csi_i2s_protocol_t; - -typedef enum { - I2S_LEFT_POLARITY_LOW, ///< Low level represents the left channel - I2S_LEFT_POLARITY_HIGH, ///< High level represents the left channel -} csi_i2s_ws_left_polarity_t; - -typedef enum { - I2S_SAMPLE_RATE_8000 = 8000U, ///< I2S sample rate is 8000 - I2S_SAMPLE_RATE_11025 = 11025U, - I2S_SAMPLE_RATE_12000 = 12000U, - I2S_SAMPLE_RATE_16000 = 16000U, - I2S_SAMPLE_RATE_22050 = 22050U, - I2S_SAMPLE_RATE_24000 = 24000U, - I2S_SAMPLE_RATE_32000 = 32000U, - I2S_SAMPLE_RATE_44100 = 44100U, - I2S_SAMPLE_RATE_48000 = 48000U, - I2S_SAMPLE_RATE_96000 = 96000U, - I2S_SAMPLE_RATE_192000 = 192000U, - I2S_SAMPLE_RATE_256000 = 256000U, -} csi_i2s_sample_rate_t; - -typedef enum { - I2S_SAMPLE_WIDTH_16BIT = 16U, ///< I2S sample width is 16bit - I2S_SAMPLE_WIDTH_24BIT = 24U, - I2S_SAMPLE_WIDTH_32BIT = 32U, -} csi_i2s_sample_width_t; - -typedef enum { - I2S_SCLK_16FS = 16U, ///< SCLK frequency is 16 times that of I2S sample rate - I2S_SCLK_32FS = 32U, - I2S_SCLK_48FS = 48U, - I2S_SCLK_64FS = 64U, -} csi_i2s_sclk_freq_t; - -typedef enum { - I2S_MCLK_256FS = 256U, ///< MCLK frequency is 256 times that of I2S sample rate - I2S_MCLK_384FS = 384U, -} csi_i2s_mclk_freq_t; - -typedef struct { - csi_i2s_mode_t mode; ///< I2S work mode - csi_i2s_protocol_t protocol; ///< Protocols used by I2S - csi_i2s_ws_left_polarity_t polarity; ///< left channel polarity - csi_i2s_sample_rate_t rate; ///< I2S sample rate - csi_i2s_sample_width_t width; ///< I2S sample width - csi_i2s_sclk_freq_t sclk_nfs; ///< SCLK frequency is N times that of I2S sample rate - csi_i2s_mclk_freq_t mclk_nfs; ///< MCLK frequency is N times that of I2S sample rate -} csi_i2s_format_t; - -typedef enum { - I2S_LEFT_CHANNEL, - I2S_RIGHT_CHANNEL, - I2S_LEFT_RIGHT_CHANNEL, -} csi_i2s_sound_channel_t; - -typedef enum { - I2S_EVENT_SEND_COMPLETE, - I2S_EVENT_RECEIVE_COMPLETE, - I2S_EVENT_TX_BUFFER_EMPTY, - I2S_EVENT_RX_BUFFER_FULL, - I2S_EVENT_ERROR_OVERFLOW, - I2S_EVENT_ERROR_UNDERFLOW, - I2S_EVENT_ERROR, -} csi_i2s_event_t; - -typedef struct csi_i2s csi_i2s_t; - -struct csi_i2s { - csi_dev_t dev; ///< I2S hw-device info - void (*callback)(csi_i2s_t *i2s, csi_i2s_event_t event, void *arg); ///< I2S event callback for user - void *arg; ///< user private param passed to user callback - csi_ringbuf_t *tx_buf; ///< I2S send buffer - csi_ringbuf_t *rx_buf; ///< I2S receive buffer - csi_dma_ch_t *tx_dma; ///< send dma channel handle - csi_dma_ch_t *rx_dma; ///< receive dma channel handle - uint32_t tx_period; ///< I2S send period num data will callback - uint32_t rx_period; ///< I2S receive period num data will callback - csi_state_t state; ///< I2S communication state - void *priv; -}; - -/** - \brief Init i2s - \param[in] i2s I2s handle to operate - \param[in] idx I2s interface idx - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_init(csi_i2s_t *i2s, uint32_t idx); - -/** - \brief Uninit i2s - \param[in] i2s I2s handle to operate - \return none -*/ -void csi_i2s_uninit(csi_i2s_t *i2s); - -/** - \brief Enable i2s - \param[in] i2s I2s handle to operate - \param[in] en True enable, False disable - \return None -*/ -void csi_i2s_enable(csi_i2s_t *i2s, bool enable); - -/** - \brief I2s config format - \param[in] i2s I2s handle to operate - \param[in] format I2s config param \ref csi_i2s_format_t - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_format(csi_i2s_t *i2s, csi_i2s_format_t *format); - -/** - \brief Set the i2s tx mono - \param[in] i2s I2s handle to operate - \param[in] ch Mono channel selection - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_tx_select_sound_channel(csi_i2s_t *i2s, csi_i2s_sound_channel_t ch); - -/** - \brief Set the i2s rx mono - \param[in] i2s I2s handle to operate - \param[in] ch Mono channel selection - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_rx_select_sound_channel(csi_i2s_t *i2s, csi_i2s_sound_channel_t ch); - -/** - \brief Link DMA channel to i2s device - \param[in] i2s I2s handle to operate - \param[in] rx_dma The DMA channel for receive, when it is NULL means to unused dma - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_rx_link_dma(csi_i2s_t *i2s, csi_dma_ch_t *rx_dma); - -/** - \brief Link DMA channel to i2s device - \param[in] i2s I2s handle to operate - \param[in] tx_dma The DMA channel for send, when it is NULL means to unused dma - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_tx_link_dma(csi_i2s_t *i2s, csi_dma_ch_t *tx_dma); - -/** - \brief I2s rx buffer config - \param[in] i2s I2s handle to operate - \param[in] buffer I2s rx buffer - \return None -*/ -void csi_i2s_rx_set_buffer(csi_i2s_t *i2s, csi_ringbuf_t *buffer); - -/** - \brief I2s tx buffer config - \param[in] i2s I2s handle to operate - \param[in] buffer I2s tx buffer - \return None -*/ -void csi_i2s_tx_set_buffer(csi_i2s_t *i2s, csi_ringbuf_t *buffer); - -/** - \brief I2s rx set period.The value of period is to report a receive completion event - after each period value data is received - \param[in] i2s I2s handle to operate - \param[in] period I2s rx period - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_rx_set_period(csi_i2s_t *i2s, uint32_t period); - -/** - \brief I2s tx set period.The value of period is to report a receive completion event - after each period value data is send - \param[in] i2s I2s handle to operate - \param[in] period I2s tx period - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_tx_set_period(csi_i2s_t *i2s, uint32_t period); - -/** - \brief Get rx csi_ringbuf buffer free space - \param[in] i2s I2s handle to operate - \return Buffer free space (bytes) -*/ -uint32_t csi_i2s_rx_buffer_avail(csi_i2s_t *i2s); - -/** - \brief Get rx csi_ringbuf buffer used space - \param[in] i2s I2s handle to operate - \return Buffer used space (bytes) -*/ -uint32_t csi_i2s_rx_buffer_remain(csi_i2s_t *i2s); - -/** - \brief Reset the rx csi_ringbuf, discard all data in the buffer - \param[in] i2s I2s handle to operate - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_rx_buffer_reset(csi_i2s_t *i2s); - -/** - \brief Get tx csi_ringbuf buffer free space - \param[in] i2s I2s handle to operate - \return Buffer free space (bytes) -*/ -uint32_t csi_i2s_tx_buffer_avail(csi_i2s_t *i2s); - -/** - \brief Get tx csi_ringbuf buffer used space - \param[in] i2s I2s handle to operate - \return Buffer used space (bytes) -*/ -uint32_t csi_i2s_tx_buffer_remain(csi_i2s_t *i2s); - -/** - \brief Reset the tx csi_ringbuf, discard all data in the buffer - \param[in] i2s Handle to operate - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_tx_buffer_reset(csi_i2s_t *i2s); - -/** - \brief Send an amount of data to buffer in blocking mode - \param[in] i2s Operate handle - \param[in] data Pointer to send data buffer - \param[in] size Send data size - \return The num of data witch is send successful -*/ -int32_t csi_i2s_send(csi_i2s_t *i2s, const void *data, uint32_t size); - -/** - \brief Receive an amount of data to buffer in blocking mode - \param[in] i2s Operate handle - \param[out] data Pointer to receive data buffer - \param[in] size Receive data size - \return The size of data receive successfully -*/ -int32_t csi_i2s_receive(csi_i2s_t *i2s, void *data, uint32_t size); - -/** - \brief Write data to the buffer - With asynchronous sending - The data is first written to the buffer and then output through the i2s interface - Return value is the number of data that was successfully written to the buffer - \param[in] i2s Operate handle - \param[in] data Pointer to send data buffer - \param[in] size Send data size - \return The data size that write to buffer -*/ -uint32_t csi_i2s_send_async(csi_i2s_t *i2s, const void *data, uint32_t size); - -/** - \brief Read data from the buffer - Using asynchronous receive, i2s writes the received data to the buffer - This function reads data from the buffer, returns the number of successful reads - Returns 0 if there is no data in the buffer - \param[in] i2s Operate handle - \param[out] data Pointer to receive data buffer - \param[in] size Receive data size - \return The size of data read successfully -*/ -uint32_t csi_i2s_receive_async(csi_i2s_t *i2s, void *data, uint32_t size); - -/** - \brief Start i2s pause asynchronous send - \param[in] i2s Operate handle - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_send_pause(csi_i2s_t *i2s); - -/** - \brief Start i2s resume asynchronous send - \param[in] i2s Operate handle - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_send_resume(csi_i2s_t *i2s); - -/** - \brief Start i2s asynchronous send - \param[in] i2s Operate handle - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_send_start(csi_i2s_t *i2s); - -/** - \brief Start i2s asynchronous receive - \param[in] i2s Operate handle - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_receive_start(csi_i2s_t *i2s); - -/** - \brief Stop i2s asynchronous send - \param[in] i2s Operate handle - \return None -*/ -void csi_i2s_send_stop(csi_i2s_t *i2s); - -/** - \brief Stop i2s asynchronous receive - \param[in] i2s Operate handle - \return None -*/ -void csi_i2s_receive_stop(csi_i2s_t *i2s); - -/** - \brief Attach the callback handler to i2s - \param[in] i2s Operate handle - \param[in] cb Callback function - \param[in] arg User private param - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_attach_callback(csi_i2s_t *i2s, void *callback, void *arg); - -/** - \brief Detach the callback handler - \param[in] i2s Operate handle - \return None -*/ -void csi_i2s_detach_callback(csi_i2s_t *i2s); - -/** - \brief Get i2s status - \param[in] i2s I2s handle to operate - \param[out] state I2s state - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_get_state(csi_i2s_t *i2s, csi_state_t *state); - -/** - \brief Enable i2s power manage - \param[in] i2s I2s handle to operate - \return error code \ref csi_error_t -*/ -csi_error_t csi_i2s_enable_pm(csi_i2s_t *i2s); - -/** - \brief Disable i2s power manage - \param[in] i2s I2s handle to operate - \return None -*/ -void csi_i2s_disable_pm(csi_i2s_t *i2s); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_I2S_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/iic.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/iic.h deleted file mode 100755 index ee46ea22..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/iic.h +++ /dev/null @@ -1,338 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file iic.h - * @brief header file for iic driver - * @version V1.0 - * @date 08. Apr 2020 - * @model iic - ******************************************************************************/ - -#ifndef _DRV_IIC_H_ -#define _DRV_IIC_H_ - -#include <stdint.h> -#include <stdbool.h> -#include <drv/common.h> -#include <drv/dma.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - \enum csi_iic_mode_t - \brief iic work in master/slave mode - */ -typedef enum { - IIC_MODE_MASTER = 0U, ///< IIC master - IIC_MODE_SLAVE ///< IIC slave -} csi_iic_mode_t; - -/** - \enum csi_iic_speed_t - \brief iic speed mode - */ -typedef enum { - IIC_BUS_SPEED_STANDARD = 0U, ///< Standard Speed (<=100kHz) - IIC_BUS_SPEED_FAST, ///< Fast Speed (<=400kHz) - IIC_BUS_SPEED_FAST_PLUS, ///< Fast plus Speed (<= 1MHz) - IIC_BUS_SPEED_HIGH ///< High Speed (<=3.4MHz) -} csi_iic_speed_t; - -/** - \enum csi_iic_address_mode_t - \brief iic address mode - */ -typedef enum { - IIC_ADDRESS_7BIT = 0U, ///< 7-bit address mode - IIC_ADDRESS_10BIT ///< 10-bit address mode -} csi_iic_addr_mode_t; - -/** - \enum csi_iic_mem_addr_size_t - \brief iic memory address size - */ -typedef enum { - IIC_MEM_ADDR_SIZE_8BIT = 0U, ///< IIC e2prom 8bit address mode - IIC_MEM_ADDR_SIZE_16BIT ///< IIC e2prom 16bit address mode -} csi_iic_mem_addr_size_t; - -/** - \enum csi_iic_event_t - \brief iic event signaled by iic driver - */ -typedef enum { - IIC_EVENT_SEND_COMPLETE = 0U, ///< Master/slave Send finished - IIC_EVENT_RECEIVE_COMPLETE, ///< Master/slave Receive finished - IIC_EVENT_ERROR_OVERFLOW, ///< Master/slave fifo overflow error - IIC_EVENT_ERROR_UNDERFLOW, ///< Master/slave fifo underflow error - IIC_EVENT_ERROR ///< The receive buffer was completely filled to FIFO and more data arrived. That data is lost -} csi_iic_event_t; - -/** - \struct csi_iic_t - \brief iic ctrl block - */ -typedef struct csi_iic csi_iic_t; -struct csi_iic { - csi_dev_t dev; ///< IIC hw-device info - void (*callback)(csi_iic_t *iic, csi_iic_event_t event, void *arg); ///< IIC event callback for user - void *arg; ///< User private param passed to user callback - uint8_t *data; ///< IIC transfer-data buffer - uint32_t size; ///< IIC transfer-data size - csi_iic_mode_t mode; ///< IIC mode - csi_dma_ch_t *tx_dma; ///< Send dma channel handle - csi_dma_ch_t *rx_dma; ///< Receive dma channel handle - void *send; ///< Send function pointer asynchronously - void *receive; ///< Receive function pointer asynchronously - csi_state_t state; ///< IIC current state - void *priv; -}; - -typedef csi_error_t (*csi_iic_master_send_async_t)(csi_iic_t *iic, uint32_t devaddr, const void *data, uint32_t size); -typedef csi_error_t (*csi_iic_master_receive_async_t)(csi_iic_t *iic, uint32_t devaddr, void *data, uint32_t size); -typedef csi_error_t (*csi_iic_slave_send_async_t)(csi_iic_t *iic, const void *data, uint32_t size); -typedef csi_error_t (*csi_iic_slave_receive_async_t)(csi_iic_t *iic, void *data, uint32_t size); - -/** - \brief Init iic ctrl block - Initializes the resources needed for the iic instance - \param[in] iic Handle of iic instance - \param[in] idx Index of instance - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_init(csi_iic_t *iic, uint32_t idx); - -/** - \brief Uninit iic ctrl block - Stops operation and releases the software resources used by the instance - \param[in] iic Handle of iic instance - \return None -*/ -void csi_iic_uninit(csi_iic_t *iic); - -/** - \brief Config iic master or slave mode - \param[in] iic Handle of iic instance - \param[in] mode iic mode \ref csi_iic_mode_t - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_mode(csi_iic_t *iic, csi_iic_mode_t mode); - -/** - \brief Config iic addr mode - \param[in] iic Handle of iic instance - \param[in] addr_mode iic addr mode \ref csi_iic_addr_mode_t - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_addr_mode(csi_iic_t *iic, csi_iic_addr_mode_t addr_mode); - -/** - \brief Config iic speed - \param[in] iic Handle of iic instance - \param[in] speed iic speed mode \ref csi_iic_speed_t - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_speed(csi_iic_t *iic, csi_iic_speed_t speed); - -/** - \brief Config iic own addr - \param[in] iic Handle of iic instance - \param[in] own_addr iic set own addr at slave mode - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_own_addr(csi_iic_t *iic, uint32_t own_addr); - -/** - \brief Start sending data as iic master - This function is blocking - \param[in] iic Handle of iic instance - \param[in] devaddr Addrress of slave device - \param[in] data Pointer to send data buffer - \param[in] size Size of data items to send - \param[in] timout Unit of time delay(ms) - \return The amount of real data sent or error code -*/ -int32_t csi_iic_master_send(csi_iic_t *iic, uint32_t devaddr, const void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start receiving data as iic master - This function is blocking - \param[in] iic Handle to operate - \param[in] devaddr iic addrress of slave device - \param[out] data Pointer to buffer for data to receive from iic receiver - \param[in] size Size of data items to receive - \param[in] timeout Unit of time delay(ms) - \return The amount of real data received or error code -*/ -int32_t csi_iic_master_receive(csi_iic_t *iic, uint32_t devaddr, void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start sending data as iic master - This function is non-blocking,\ref csi_iic_event_t is signaled when transfer completes or error happens - \param[in] iic Handle to operate - \param[in] devaddr iic addrress of slave device - \param[in] data Pointer to send data buffer - \param[in] size Size of data items to send - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_master_send_async(csi_iic_t *iic, uint32_t devaddr, const void *data, uint32_t size); - -/** - \brief Start receiving data as iic master. - This function is non-blocking.\ref csi_iic_event_t is signaled when transfer completes or error happens - \param[in] iic Handle to operate - \param[in] devaddr iic addrress of slave device - \param[out] data Pointer to buffer for data to receive from iic receiver - \param[in] size Size of data items to receive - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_master_receive_async(csi_iic_t *iic, uint32_t devaddr, void *data, uint32_t size); - -/** - \brief Start sending data as iic master - This function is blocking - \param[in] iic Handle of iic instance - \param[in] devaddr Addrress of slave device - \param[in] memaddr Internal addr of device - \param[in] memaddr_size Internal addr mode of device - \param[in] data Pointer to send data buffer - \param[in] size Size of data items to send - \param[in] timout Unit of time delay(ms) - \return The amount of real data sent or error code -*/ -int32_t csi_iic_mem_send(csi_iic_t *iic, uint32_t devaddr, uint16_t memaddr, csi_iic_mem_addr_size_t memaddr_size, const void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start receiving data as iic master - This function is blocking - \param[in] iic Handle to operate - \param[in] devaddr iic addrress of slave device - \param[in] memaddr Internal addr of device - \param[in] memaddr_mode Internal addr mode of device - \param[out] data Pointer to buffer for data to receive from eeprom device - \param[in] size Size of data items to receive - \param[in] timeout Unit of time delay(ms) - \return The amount of real data received or error code -*/ -int32_t csi_iic_mem_receive(csi_iic_t *iic, uint32_t devaddr, uint16_t memaddr, csi_iic_mem_addr_size_t memaddr_size, void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start sending data as iic slave - This function is blocking - \param[in] iic Handle to operate - \param[in] data Pointer to buffer with data to send to iic master - \param[in] size Size of data items to send - \param[in] timeout Unit of time delay(ms) - \return The amount of real data sent or error code -*/ -int32_t csi_iic_slave_send(csi_iic_t *iic, const void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start receiving data as iic slave - This function is blocking - \param[in] iic Handle to operate - \param[out] data Pointer to buffer for data to receive from iic master - \param[in] size Size of data items to receive - \param[in] timeout Unit of time delay(ms) - \return The amount of real data received or error code -*/ -int32_t csi_iic_slave_receive(csi_iic_t *iic, void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start sending data as iic slave - This function is non-blocking,\ref csi_iic_event_t is signaled when transfer completes or error happens - \param[in] iic Handle to operate - \param[in] data Pointer to buffer with data to send to iic master - \param[in] size Size of data items to send - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_slave_send_async(csi_iic_t *iic, const void *data, uint32_t size); - -/** - \brief Start receiving data as iic slave - This function is non-blocking,\ref csi_iic_event_t is signaled when transfer completes or error happens - \param[in] handle iic handle to operate - \param[out] data Pointer to buffer for data to receive from iic master - \param[in] size Size of data items to receive - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_slave_receive_async(csi_iic_t *iic, void *data, uint32_t size); - -/** - \brief Attach callback to the iic - \param[in] iic iic handle to operate - \param[in] cb Event callback function \ref csi_iic_callback_t - \param[in] arg User private param for event callback - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_attach_callback(csi_iic_t *iic, void *callback, void *arg); - -/** - \brief Detach callback from the iic - \param[in] iic iic handle to operate - \return None -*/ -void csi_iic_detach_callback(csi_iic_t *iic); - -/** - \brief Config iic stop to generate - \param[in] iic iic handle to operate - \param[in] enable Transfer operation is pending - stop condition will not be generated - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_xfer_pending(csi_iic_t *iic, bool enable); - -/** - \brief Link DMA channel to iic device - \param[in] iic Handle to operate - \param[in] tx_dma The DMA channel handle for send, when it is NULL means to unlink the channel - \param[in] rx_dma The DMA channel handle for receive, when it is NULL means to unlink the channel - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_link_dma(csi_iic_t *iic, csi_dma_ch_t *tx_dma, csi_dma_ch_t *rx_dma); - -/** - \brief Get iic state - \param[in] iic Handle to operate - \param[out] state iic state \ref csi_state_t - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_get_state(csi_iic_t *iic, csi_state_t *state); - -/** - \brief Enable iic power manage - \param[in] iic iic handle to operate - \return error code \ref csi_error_t -*/ -csi_error_t csi_iic_enable_pm(csi_iic_t *iic); - -/** - \brief Disable iic power manage - \param[in] iic iic handle to operate - \return None -*/ -void csi_iic_disable_pm(csi_iic_t *iic); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_IIC_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/intc.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/intc.h deleted file mode 100755 index 573f33eb..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/intc.h +++ /dev/null @@ -1,178 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/intc.h - * @brief Header File for INTC Driver - * @version V1.0 - * @date 02. June 2020 - * @model intc - ******************************************************************************/ - -#ifndef _DRV_INTC_H_ -#define _DRV_INTC_H_ - -#include <stdint.h> -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif -typedef enum int_trigger_mode_t { - INT_MODE_LOW_LEVEL, - INT_MODE_HIGH_LEVEL, - INT_MODE_RISING_EDGE, - INT_MODE_FALLING_EDGE, - INT_MODE_DOUBLE_EDGE, -} int_trigger_mode_t; - -/** - \brief Initialize the INTC interrupt controller - */ -void csi_intc_init(void); - -/** - \brief Enable External Interrupt - \details Enables a device-specific interrupt in the INTC interrupt controller. - \param[in] IRQn External interrupt number. Value cannot be negative. - */ -void csi_intc_enable_irq(int32_t IRQn); - -/** - \brief Disable External Interrupt - \details Disables a device-specific interrupt in the INTC interrupt controller. - \param[in] IRQn External interrupt number. Value cannot be negative. - */ -void csi_intc_disable_irq(int32_t IRQn); - -/** - \brief Get Pending Interrupt - \details Reads the pending register in the INTC and returns the pending bit for the specified interrupt. - \param[in] IRQn Interrupt number. - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -uint32_t csi_intc_get_pending_irq(int32_t IRQn); - -/** - \brief Set Pending Interrupt - \details Sets the pending bit of an external interrupt. - \param[in] IRQn Interrupt number. Value cannot be negative. - */ -void csi_intc_set_pending_irq(int32_t IRQn); - -/** - \brief Clear Pending Interrupt - \details Clears the pending bit of an external interrupt. - \param[in] IRQn External interrupt number. Value cannot be negative. - */ -void csi_intc_clear_pending_irq(int32_t IRQn); - -/** - \brief Get Wake up Interrupt - \details Reads the wake up register in the INTC and returns the pending bit for the specified interrupt. - \param[in] IRQn Interrupt number. - \return 0 Interrupt is not set as wake up interrupt. - \return 1 Interrupt is set as wake up interrupt. - */ -uint32_t csi_intc_get_wakeup_irq(int32_t IRQn); - -/** - \brief Set Wake up Interrupt - \details Sets the wake up bit of an external interrupt. - \param[in] IRQn Interrupt number. Value cannot be negative. - */ -void csi_intc_set_wakeup_irq(int32_t IRQn); - -/** - \brief Clear Wake up Interrupt - \details Clears the wake up bit of an external interrupt. - \param[in] IRQn External interrupt number. Value cannot be negative. - */ -void csi_intc_clear_wakeup_irq(int32_t IRQn); - -/** - \brief Get Active Interrupt - \details Reads the active register in the INTC and returns the active bit for the device specific interrupt. - \param[in] IRQn Device specific interrupt number. - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. - \note IRQn must not be negative. - */ -uint32_t csi_intc_get_active(int32_t IRQn); - -/** - \brief Set Threshold register - \details set the threshold register in the INTC. - \param[in] VectThreshold specific vecter threshold. - \param[in] PrioThreshold specific priority threshold. - */ -void csi_intc_set_threshold(uint32_t VectThreshold, uint32_t PrioThreshold); - -/** - \brief Set Interrupt Priority - \details Sets the priority of an interrupt. - \note The priority cannot be set for every core interrupt. - \param[in] IRQn Interrupt number. - \param[in] priority Priority to set. - */ -void csi_intc_set_prio(int32_t IRQn, uint32_t priority); - -/** - \brief Get Interrupt Priority - \details Reads the priority of an interrupt. - The interrupt number can be positive to specify an external (device specific) interrupt, - or negative to specify an internal (core) interrupt. - \param[in] IRQn Interrupt number. - \return Interrupt Priority. - Value is aligned automatically to the implemented priority bits of the microcontroller. - */ -uint32_t csi_intc_get_prio(int32_t IRQn); - -/** - \brief funciton is acknowledge the IRQ. this interface is internally used by irq system - \param[in] irq irq number to operate - \return 0 on success; -1 on failure - */ -int csi_intc_ack_irq(int32_t IRQn); - -/** - \brief This function is set the attributes of an IRQ. - \param[in] irq irq number to operate - \param[in] priority interrupt priority - \param[in] trigger_mode interrupt trigger_mode - \return 0 on success; -1 on failure -*/ -int csi_intc_set_attribute(int32_t IRQn, uint32_t priority, int_trigger_mode_t trigger_mode); - -/** - \brief Set interrupt handler - \details Set the interrupt handler according to the interrupt num, the handler will be filled in g_irqvector[]. - \param[in] IRQn Interrupt number. - \param[in] handler Interrupt handler. - */ -void csi_intc_set_vector(int32_t IRQn, uint32_t handler); - -/** - \brief Get interrupt handler - \details Get the address of interrupt handler function. - \param[in] IRQn Interrupt number. - */ -uint32_t csi_intc_get_vector(int32_t IRQn); - -#endif /* _DRV_INTC_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/io.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/io.h deleted file mode 100755 index 5b970c33..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/io.h +++ /dev/null @@ -1,131 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/io.h - * @brief Header File for register bits operation - * @version V1.0 - * @date 9. Oct 2020 - * @model io - ******************************************************************************/ - -#ifndef _DRV_IO_H_ -#define _DRV_IO_H_ - -#include <stdint.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* Bit field operate*/ -#define REG64(addr) (*(volatile uint64_t *)(addr)) -#define REG32(addr) (*(volatile uint32_t *)(addr)) -#define REG16(addr) (*(volatile uint16_t *)(addr)) -#define REG8(addr) (*(volatile uint8_t *)(addr)) - -/* Insert value to some field in reg, other field is set to 0(the field make macro) */ -#define HAL_FMK(PER_REG_FIELD, val) \ - (((val) << PER_REG_FIELD##_SHIFT) & PER_REG_FIELD##_MASK) - -/* Get value of some field in reg(the field extract macro) */ -#define HAL_FEXT(reg, PER_REG_FIELD) \ - (((reg) & PER_REG_FIELD##_MASK) >> PER_REG_FIELD##_SHIFT) - -/* Insert value to some field in reg, other field don't change(the field insert macro) */ -#define HAL_FINS(reg, PER_REG_FIELD, val) \ - ((reg) = ((reg) & ~PER_REG_FIELD##_MASK) \ - | HAL_FMK(PER_REG_FIELD, val)) - - -/* Bit operate */ -/* Set one value to 1, other bit don't change*/ -#define HAL_BIT_SET(reg, bit) ((reg) = ((reg) | (1U << (bit)))) - -/* Set one value to 0, other bit don't change*/ -#define HAL_BIT_CLR(reg, bit) ((reg) = ((reg) & (~(1U << (bit))))) - -/* Get value of one bit(0/1) */ -#define HAL_GET_BIT_VAL(reg, bit) (((reg)>> (bit)) & 1U) - -/* Judge one bit is 1 or not */ -#define HAL_IS_BIT_SET(reg, pos) (((reg) & (1U << (pos))) != 0x0U) - -/* Judge one bit is 0 or not */ -#define HAL_IS_BIT_CLR(reg, pos) (((reg) & (1U << (pos))) == 0x0U) - -/* Set one value to bit, other bit don't change*/ -#define HAL_BIT_INSR(reg, bit, val) \ - ((reg) = (((reg) & (~(1U << (bit)))) | (((val) & 1U) << (bit)))) - - -static inline uint8_t getreg8(volatile void *addr) -{ - return *(volatile uint8_t *)addr; -} - -static inline void putreg8(uint8_t val, volatile void *addr) -{ - *(volatile uint8_t *)addr = val; -} - -static inline uint16_t getreg16(volatile void *addr) -{ - return *(volatile uint16_t *)addr; -} - -static inline void putreg16(uint16_t val, volatile void *addr) -{ - *(volatile uint16_t *)addr = val; -} - -static inline uint32_t getreg32(volatile void *addr) -{ - return *(volatile uint32_t *)addr; -} - -static inline void putreg32(uint32_t val, volatile void *addr) -{ - *(volatile uint32_t *)addr = val; -} - -static inline uint64_t getreg64(volatile void *addr) -{ - return *(volatile uint64_t *)addr; -} - -static inline void putreg64(uint32_t val, volatile void *addr) -{ - *(volatile uint64_t *)addr = val; -} - -static inline uint32_t inl(void *addr) -{ - return *(volatile uint32_t *)addr; -} - -static inline void outl(uint32_t val, void *addr) -{ - *(volatile uint32_t *)addr = val; -} - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_IO_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/iso7816.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/iso7816.h deleted file mode 100755 index 706d4fa6..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/iso7816.h +++ /dev/null @@ -1,409 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/iso7816.h - * @brief Header File for ISO7816 Driver - * @version V1.0 - * @date 9. Oct 2020 - * @model iso7816 - ******************************************************************************/ - -#ifndef _DRV_ISO7816_H_ -#define _DRV_ISO7816_H_ - -#include <stdint.h> -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - A_5V, - B_3_3V, - C_1_8V, -} dcd_vclass_t; - -typedef enum { - T0, - T1, -} iso7816_tprotocol_t; - -typedef enum { - ISO7816_EVENT_CARD_DETECTED, - ISO7816_EVENT_READ_COMPLETE, - ISO7816_EVENT_WRITE_COMPLETE, - ISO7816_EVENT_READ_ERROR, - ISO7816_EVENT_WRITE_ERROR, - ISO7816_EVENT_ACTIVATE_SUCCESS, - ISO7816_EVENT_ACTIVATE_FAILED, - ISO7816_EVENT_CARD_ERROR_DEACTIVATE, - ISO7816_EVENT_CARD_SESSION_CLOSED, - ISO7816_EVENT_RX_FULL, - ISO7816_EVENT_CWT_TIME_OUT, - ISO7816_EVENT_RX_OVER, - ISO7816_EVENT_CRC_ERR, - ISO7816_EVENT_PARITY_ERR, - ISO7816_EVENT_SLAVE_ATR_DETECTED, - ISO7816_EVENT_SLAVE_ATR_DONE, -} iso7816_event_t; - -typedef void (*iso7816_event_cb_t)(iso7816_event_t event, void *arg); - -typedef enum { - ISO7816_SLAVE, - ISO7816_MASTER, -} iso7816_mode_t; - -typedef struct { - uint8_t clk_div; - dcd_vclass_t vclass; - iso7816_mode_t mode; - int32_t card_detected_en; -} iso7816_config_t; - -typedef enum { - ISO7816_A_ONLY = 1U, - ISO7816_B_ONLY, - ISO7816_C_ONLY, - ISO7816_AB, - ISO7816_AC, - ISO7816_BC, - ISO7816_ABC, -} iso7816_voltage_class_t; - -typedef struct { - iso7816_voltage_class_t support_voltage_class; - int32_t proto_t; - int32_t clk_stop_is_support; - int32_t history_byte_num; - uint8_t history_data[15]; -} iso7816_atr_info_t; - -typedef enum { - EVEN_PARITY, - ODD_PARITY, -} iso7816_parity_type_t; - -typedef enum { - ISO7816_DRIECT, - ISO7816_INVERSE, -} iso7816_convention_t; - -typedef enum { - INVCTIVE, - ACTIVATEING, - PSS_TRF, - PSS_RECV, - ACTIVATE, -} iso7816_card_sta_t; - -/** - \brief Initialize ISO7816 master interface - \param[in] idx Master index - \param[in] cb_event Pointer to \ref iso7816_event_cb_t - \param[in] cb_arg Event callback arg - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_init(int idx, iso7816_event_cb_t cb_event, void *cb_arg); - -/** - \brief Uninit ISO7816 master interface - \param[in] idx Master index - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_uninit(int idx); - -/** - \brief Config ISO7816 master attributes - \param[in] idx Master index - \param[in] config master config \ref iso7816_config_t - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_config(int idx, iso7816_config_t *config); - -/** - \brief Receiving data from ISO7816 master receiver, used polling mode - \param[in] idx Master index - \param[in] buf Pointer to buffer for data to receive from i2s receiver - \param[in] len Size of receiver data - \param[in] time_out Receive time out value - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_receive(int idx, uint8_t *buf, uint32_t len, uint32_t time_out); - -/** - \brief Receiving data from ISO7816 master receiver, used interrupt mode - \param[in] idx Master index - \param[in] buf Pointer to buffer for data to receive from i2s receiver - \param[in] len Size of receiver data - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_receive_it(int idx, uint8_t *buf, uint32_t len); - -/** - \brief Sending data to ISO7816 master transmitter, used polling mode - \param[in] idx Master index - \param[in] buf Pointer to buffer for data to send - \param[in] len Size of tranmitter data - \param[in] time_out Send time out value - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_send(int idx, uint8_t *buf, uint32_t len, uint32_t time_out); - -/** - \brief Sending data to ISO7816 master transmitter, used interrupt mode - \param[in] idx Master index - \param[in] buf Pointer to buffer for data to send - \param[in] len Size of tranmitter data - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_send_it(int idx, uint8_t *buf, uint32_t len); - -/** - \brief ISO7816 master performs the activation smart card process, this process - is non-blocking,should monitor callback event or read card status to check card is activate - \param[in] idx Master index - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_card_activate(int idx); - -/** - \brief ISO7816 master performs the deactivation smart card process, this process - is non-blocking,should monitor callback event or read card status to check card is activate - \param[in] idx Master index - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_card_deactivate(int idx); - -/** - \brief The smard card session status - \param[in] idx Master index - \return smart card status. -*/ -iso7816_card_sta_t csi_iso7816_master_card_status(int idx); - -/** - \brief ISO7816 master performs the warm reset smart card process - \param[in] idx Master index - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_card_warm_reset(int idx); - -/** - \brief ISO7816 master performs clock stop - \param[in] idx Master index - \param[in] en The clk last state when power down - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_card_clk_stop_enable(int idx, int en); - -/** - \brief ISO7816 master performs pwoer down - \param[in] idx Master index - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_power_down(int idx); - -/** - \brief Get atr analytical results - \param[in] idx Master index - \param[out] info The result of atr information - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_master_atr_info(int idx, iso7816_atr_info_t *info); - -/** - \brief Initialize ISO7816 slave interface - \param[in] idx Slave index - \param[in] cb Pointer to \ref iso7816_event_cb_t - \param[in] cb_arg Event callback arg - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_init(int idx, iso7816_event_cb_t cb, void *cb_arg); - -/** - \brief Uninit ISO7816 slave interface - \param[in] idx Slave index - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_uninit(int idx); - -/** - \brief Enable ISO7816 slave interface - \param[in] idx Slave index - \param[in] en Slave enable - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_enable(int idx, int en); - -/** - \brief Enable ISO7816 slave receive parity - \param[in] idx Slave index - \param[in] en Enable receive parity - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_receive_parity_enable(int idx, int en); - -/** - \brief Set ISO7816 slave receive parity attributes - \param[in] idx Slave index - \param[in] type Set receiver parity type - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_set_receive_parity(int idx, iso7816_parity_type_t type); - -/** - \brief Enable ISO7816 slave send parity - \param[in] idx Slave index - \param[in] en Enable send parity - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_send_parity_enable(int idx, int en); - -/** - \brief Set ISO7816 slave send parity attributes - \param[in] idx Slave index - \param[in] type Set send parity attributes - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_set_send_parity(int idx, iso7816_parity_type_t type); - -/** - \brief Set the number of ISO7816 slave receive retry - \param[in] idx Slave index - \param[in] val Set the number retry - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_set_receive_retry(int idx, uint8_t val); - -/** - \brief Set the number of ISO7816 send send retry - \param[in] idx Slave index - \param[in] val Set the number retry - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_set_send_retry(int idx, uint8_t val); - -/** - \brief Set the ISO7816 slave GT - \param[in] idx Slave index - \param[in] val Set the slave GT - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_set_gt(int idx, uint8_t val); - -/** - \brief Set the ISO7816 slave WT - \param[in] idx Slave index - \param[in] val Set the slave WT - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_set_wt(int idx, uint16_t val); - -/** - \brief Set the ISO7816 slave baud, baud = F/D - \param[in] idx Slave index - \param[in] val Set the slave baud - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_set_baud(int idx, uint16_t val); - -/** - \brief Set the ISO7816 slave convention - \param[in] idx Slave index - \param[in] convention Set the slave convention \ref iso7816_convention_t - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_set_convention(int idx, iso7816_convention_t convention); - -/** - \brief Set the ISO7816 slave art response time, val range is 400~40000 - \param[in] idx Slave index - \param[in] val Set the slave art response time - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_set_atr_ack_time(int idx, int val); - -/** - \brief Set the ISO7816 slave send atr data - \param[in] idx Slave index - \param[in] buf Pointer to buffer for data to send - \param[in] len Size of tranmitter data - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_send_atr(int idx, uint8_t *buf, int len); - -/** - \brief Receiving data from ISO7816 slave receiver, used polling mode - \param[in] idx Master index - \param[in] buf Pointer to buffer for data to receive from i2s receiver - \param[in] len Size of receiver data - \param[in] timer_out receive time out value - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_receive(int idx, uint8_t *buf, uint32_t len, uint32_t time_out); - -/** - \brief Flushed the ISO7816 slave receive fifo - \param[in] idx Master index - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_flushed_receive_fifo(int idx); - -/** - \brief Receiving data from ISO7816 slave receiver, used interrupt mode - \param[in] idx Master index - \param[in] buf Pointer to buffer for data to receive from i2s receiver - \param[in] len Size of receiver data - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_receive_it(int idx, uint8_t *buf, uint32_t len); - -/** - \brief Sending data to ISO7816 slave transmitter, used polling mode - \param[in] idx Slave index - \param[in] buf Pointer to buffer for data to send - \param[in] len Size of tranmitter data - \param[in] timer_out Send time out value - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_send(int idx, uint8_t *buf, uint32_t len, uint32_t time_out); - -/** - \brief Flushed the ISO7816 slave send fifo. - \param[in] idx Master index - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_flushed_send_fifo(int idx); - -/** - \brief Sending data to ISO7816 slave transmitter, used interrupt mode - \param[in] idx Slave index - \param[in] buf Pointer to buffer for data to send - \param[in] len Size of tranmitter data - \return 0 for success, negative for error code -*/ -int32_t csi_iso7816_slave_send_it(int idx, uint8_t *buf, uint32_t len); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_ISO7816_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/mbox.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/mbox.h deleted file mode 100755 index c5090425..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/mbox.h +++ /dev/null @@ -1,104 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/mbox.h - * @brief Header File for MBOX Driver - * @version V1.0 - * @date 5. Apr 2020 - * @model mbox - ******************************************************************************/ - -#ifndef _DRV_MBOX_H_ -#define _DRV_MBOX_H_ - -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - MBOX_EVENT_SEND_COMPLETE = 0U, ///< Send completed; however mbox may still transmit data - MBOX_EVENT_RECEIVED = 1U, ///< Data Received, only in mbox buf, call memcpy() get the data - MBOX_EVENT_ERROR = 2U, ///< Mbox transmit error occurred -} csi_mbox_event_t; - -typedef struct csi_mbox csi_mbox_t; -struct csi_mbox { - csi_dev_t dev; - void (*callback)(csi_mbox_t *mbox, csi_mbox_event_t event, uint32_t channel_id, uint32_t received_len, void *arg); - void *arg; - void *priv; -}; - -/** - \brief Initialize mbox Interface. - Initializes the resources needed for the mbox interface. - \param[in] mbox Operate handle. - \param[in] idx The device idx. - \return Error code \ref csi_error_t. -*/ -csi_error_t csi_mbox_init(csi_mbox_t *mbox, uint32_t idx); - -/** - \brief Uninitialize mbox interface. stops operation and releases the software resources used by the interface. - \param[in] mbox Operate handle. -*/ -void csi_mbox_uninit(csi_mbox_t *mbox); - -/** - \brief Start sending data to mbox transmitter. - \param[in] mbox Operate handle. - \param[in] channel_id Index of channel. - \param[in] data Pointer to buffer with data to send to mbox transmitter. - \param[in] size Number of data items to send. - \return sent Number of data or error code. -*/ -int32_t csi_mbox_send(csi_mbox_t *mbox, uint32_t channel_id, const void *data, uint32_t size); - -/** - \brief Start receiving data from mbox receiver. - \param[in] mbox Operate handle. - \param[in] channel_id Index of channel. - \param[out] data Pointer to buffer with data to receive from mailbox. - \param[in] size Number of data items to receive. - \return received Number or error code. -*/ -int32_t csi_mbox_receive(csi_mbox_t *mbox, uint32_t channel_id, void *data, uint32_t size); - -/** - \brief Attach callback to the mbox. - \param[in] mbox Operate handle. - \param[in] cb Event callback function. - \param[in] arg User private param for event callback. - \return Error code \ref csi_error_t. -*/ -csi_error_t csi_mbox_attach_callback(csi_mbox_t *mbox, void *callback, void *arg); - -/** - \brief Detach callback from the mbox - \param[in] mbox Operate handle. -*/ -void csi_mbox_detach_callback(csi_mbox_t *mbox); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_MBOX_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/pm.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/pm.h deleted file mode 100755 index 1894f206..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/pm.h +++ /dev/null @@ -1,122 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/pm.h - * @brief Header File for PM Driver - * @version V1.0 - * @date 10. Oct 2020 - * @model pm - ******************************************************************************/ - -#ifndef _DRV_PM_H_ -#define _DRV_PM_H_ - -#include <stdint.h> -#include <soc.h> -#include <csi_core.h> -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - \brief Initialize PM module - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pm_init(void); - -/** - \brief De-initialize PM module - \return None -*/ -void csi_pm_uninit(void); - -/** - \brief Set the retention memory used to save registers - \param[in] mem Retention memory(word align) - \param[in] num Number of memory(1: 1 word) - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pm_set_reten_mem(uint32_t *mem, uint32_t num); - -/** - \brief Config the wakeup source - \param[in] wakeup_num Wakeup source num - \param[in] enable Flag control the wakeup source is enable or not - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pm_config_wakeup_source(uint32_t wakeup_num, bool enable); - -/** - \brief System enter low-power mode - \param[in] mode Low-power mode, \ref csi_pm_mode_t - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pm_enter_sleep(csi_pm_mode_t mode); - -/** - \brief Register device to the PM list - \param[in] dev Csi dev - \param[in] pm_action PM action function - \param[in] mem_size Size of memory for saving registers - \param[in] priority PM dev priority(0-3), The smaller the value, - the last execution before entering low power consumption, - the first execution after exiting low power consumption - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pm_dev_register(csi_dev_t *dev, void *pm_action, uint32_t mem_size, uint8_t priority); - -/** - \brief Deregister device to the PM list - \param[in] dev Csi dev - \return None -*/ -void csi_pm_dev_unregister(csi_dev_t *dev); - -/** - \brief Save registers to memory - \param[in] mem Mem to store registers - \param[in] addr Registers address - \param[in] num Number of memory(1: 1 word) - \return None -*/ -void csi_pm_dev_save_regs(uint32_t *mem, uint32_t *addr, uint32_t num); - -/** - \brief Save registers to memory - \param[in] mem Mem to store registers - \param[in] addr Registers address - \param[in] num Number of memory(1: 1 word) - \return None -*/ -void csi_pm_dev_restore_regs(uint32_t *mem, uint32_t *addr, uint32_t num); - -/** - \brief Notify devices enter low-power states - \param[in] action Device low-power action - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pm_dev_notify(csi_pm_dev_action_t action); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_PM_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/pmu.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/pmu.h deleted file mode 100755 index ac5bbadf..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/pmu.h +++ /dev/null @@ -1,118 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv_pmu.h - * @brief header file for pmu driver - * @version V1.0 - * @date 02. June 2017 - * @model pmu - ******************************************************************************/ - -#ifndef _DRV_PMU_H_ -#define _DRV_PMU_H_ - - -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif -/// definition for pmu handle. -typedef void *pmu_handle_t; - -/****** PMU specific error codes *****/ -typedef enum { - EDRV_PMU_MODE = (1), ///< Specified Mode not supported -} pmu_error_e; - -/*----- PMU Control Codes: Mode -----*/ -typedef enum { - PMU_MODE_RUN = 0, ///< Running mode - PMU_MODE_SLEEP, ///< Sleep mode - PMU_MODE_DOZE, ///< Doze mode - PMU_MODE_DORMANT, ///< Dormant mode - PMU_MODE_STANDBY, ///< Standby mode - PMU_MODE_SHUTDOWN ///< Shutdown mode -} pmu_mode_e; - -/*----- PMU Control Codes: Wakeup type -----*/ -typedef enum { - PMU_WAKEUP_TYPE_PULSE = 0, ///< Pulse interrupt - PMU_WAKEUP_TYPE_LEVEL ///< Level interrupt -} pmu_wakeup_type_e; - -/*----- PMU Control Codes: Wakeup polarity -----*/ -typedef enum { - PMU_WAKEUP_POL_LOW = 0, ///< Low or negedge - PMU_WAKEUP_POL_HIGH ///< High or posedge -} pmu_wakeup_pol_e; - -/****** PMU Event *****/ -typedef enum { - PMU_EVENT_SLEEP_DONE = 0, ///< Send completed; however PMU may still transmit data - PMU_EVENT_PREPARE_SLEEP = 1 -} pmu_event_e; - -typedef void (*pmu_event_cb_t)(int32_t idx, pmu_event_e event, pmu_mode_e mode); ///< Pointer to \ref pmu_event_cb_t : PMU Event call back. - -/** - \brief Initialize PMU Interface. 1. Initializes the resources needed for the PMU interface 2.registers event callback function - \param[in] idx the id of the pmu - \param[in] cb_event Pointer to \ref pmu_event_cb_t - \return return pmu handle if success -*/ -pmu_handle_t csi_pmu_initialize(int32_t idx, pmu_event_cb_t cb_event); - -/** - \brief De-initialize PMU Interface. stops operation and releases the software resources used by the interface - \param[in] handle pmu handle to operate. - \return error code -*/ -int32_t csi_pmu_uninitialize(pmu_handle_t handle); - -/** - \brief choose the pmu mode to enter - \param[in] handle pmu handle to operate. - \param[in] mode \ref pmu_mode_e - \return error code -*/ -int32_t csi_pmu_enter_sleep(pmu_handle_t handle, pmu_mode_e mode); - -/** - \brief control pmu power. - \param[in] handle pmu handle to operate. - \param[in] state power state.\ref csi_power_stat_e. - \return error code -*/ -/** - \brief Config the wakeup source. - \param[in] handle pmu handle to operate - \param[in] wakeup_num wakeup source num - \param[in] type \ref pmu_wakeup_type - \param[in] pol \ref pmu_wakeup_pol - \param[in] enable flag control the wakeup source is enable or not - \return error code -*/ -int32_t csi_pmu_config_wakeup_source(pmu_handle_t handle, uint32_t wakeup_num, pmu_wakeup_type_e type, pmu_wakeup_pol_e pol, uint8_t enable); - -#ifdef __cplusplus -} -#endif - -#endif /* _CSI_PMU_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/pwm.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/pwm.h deleted file mode 100755 index 0db71e97..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/pwm.h +++ /dev/null @@ -1,172 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/pwm.h - * @brief Header File for PWM Driver - * @version V1.0 - * @date 9. Oct 2020 - * @model pwm - ******************************************************************************/ - -#ifndef _DRV_PWM_H_ -#define _DRV_PWM_H_ - -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - PWM_POLARITY_HIGH = 0U, ///< High level - PWM_POLARITY_LOW ///< Low level -} csi_pwm_polarity_t; - -typedef enum { - PWM_CAPTURE_POLARITY_POSEDGE = 0U, ///< Posedge Edge - PWM_CAPTURE_POLARITY_NEGEDGE, ///< Negedge Edge - PWM_CAPTURE_POLARITY_BOTHEDGE ///< Both Edge -} csi_pwm_capture_polarity_t; - -typedef enum { - PWM_EVENT_CAPTURE_POSEDGE = 0U, ///< Capture Posedge Event - PWM_EVENT_CAPTURE_NEGEDGE, ///< Capture Negedge Event - PWM_EVENT_CAPTURE_BOTHEDGE, ///< Capture Bothedge Event - PWM_EVENT_ERROR, ///< Error -} csi_pwm_event_t; - -typedef struct csi_pwm csi_pwm_t; - -struct csi_pwm { - csi_dev_t dev; - void (*callback)(csi_pwm_t *pwm, csi_pwm_event_t event, uint32_t ch, uint32_t time_us, void *arg); - void *arg; - void *priv; -}; - -/** - \brief Initialize PWM interface. Initializes the resources needed for the PWM interface - \param[in] pwm Handle to operate - \param[in] idx PWM idx - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pwm_init(csi_pwm_t *pwm, uint32_t idx); - -/** - \brief De-initialize PWM interface. Stops operation and releases the software resources used by the interface - \param[in] pwm Handle to operate - \return None -*/ -void csi_pwm_uninit(csi_pwm_t *pwm); - -/** - \brief Config PWM out mode - \param[in] pwm Handle to operate - \param[in] channel Channel num - \param[in] period_us The PWM period in us - \param[in] pulse_width_us The PMW pulse width in us - \param[in] polarity The PWM polarity \ref csi_pwm_polarity_t - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pwm_out_config(csi_pwm_t *pwm, - uint32_t channel, - uint32_t period_us, - uint32_t pulse_width_us, - csi_pwm_polarity_t polarity); - -/** - \brief Start generate PWM signal - \param[in] pwm Handle to operate - \param[in] channel Channel num - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pwm_out_start(csi_pwm_t *pwm, uint32_t channel); - -/** - \brief Stop generate PWM signal - \param[in] pwm Handle to operate - \param[in] channel Channel num - \return None -*/ -void csi_pwm_out_stop(csi_pwm_t *pwm, uint32_t channel); - -/** - \brief Config PWM capture mode - \param[in] pwm Handle to operate - \param[in] channel Channel num - \param[in] polarity PWM capture polarity \ref csi_pwm_capture_polarity_t - \param[in] count PWM capture polarity count - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pwm_capture_config(csi_pwm_t *pwm, - uint32_t channel, - csi_pwm_capture_polarity_t polarity, - uint32_t count); - -/** - \brief Start PWM capture - \param[in] pwm Handle to operate - \param[in] channel Channel num - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pwm_capture_start(csi_pwm_t *pwm, uint32_t channel); - -/** - \brief Stop PWM capture - \param[in] pwm Handle to operate - \param[in] channel Channel num - \return None -*/ -void csi_pwm_capture_stop(csi_pwm_t *pwm, uint32_t channel); - -/** - \brief Attach PWM callback - \param[in] pwm Handle to operate - \param[in] callback Callback func - \param[in] arg Callback's param - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pwm_attach_callback(csi_pwm_t *pwm, void *callback, void *arg); - -/** - \brief Detach PWM callback - \param[in] pwm Handle to operate - \return None -*/ -void csi_pwm_detach_callback(csi_pwm_t *pwm); - -/** - \brief Enable PWM power manage - \param[in] pwm Handle to operate - \return Error code \ref csi_error_t -*/ -csi_error_t csi_pwm_enable_pm(csi_pwm_t *pwm); - -/** - \brief Disable PWM power manage - \param[in] pwm Handle to operate - \return None -*/ -void csi_pwm_disable_pm(csi_pwm_t *pwm); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_PWM_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/qspi.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/qspi.h deleted file mode 100755 index e8f33312..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/qspi.h +++ /dev/null @@ -1,304 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/qspi.h - * @brief Header File for QSPI Driver - * @version V1.0 - * @date 8. Apr 2020 - * @model qspi - ******************************************************************************/ - -#ifndef _DRV_QSPI_H_ -#define _DRV_QSPI_H_ - -#include <stdint.h> -#include <stdbool.h> -#include <drv/common.h> -#include <drv/dma.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \enum csi_qspi_clock_mode_t - * \brief QSPI clock mode - */ -typedef enum { - QSPI_CLOCK_MODE_0 = 0, ///< Clock Polarity 0, Clock Phase 0 - QSPI_CLOCK_MODE_1, ///< Clock Polarity 0, Clock Phase 1 - QSPI_CLOCK_MODE_2, ///< Clock Polarity 1, Clock Phase 0 - QSPI_CLOCK_MODE_3, ///< Clock Polarity 1, Clock Phase 1 -} csi_qspi_mode_t; - -/** - * \enum csi_qspi_bus_width_t - * \brief QSPI bus width - */ -typedef enum { - QSPI_CFG_BUS_SINGLE = 0, ///< Single line - QSPI_CFG_BUS_DUAL, ///< Two line - QSPI_CFG_BUS_QUAD, ///< Four line -} csi_qspi_bus_width_t; - -/** - * \enum csi_qspi_address_size_t - * \brief Address size in bits - */ -typedef enum { - QSPI_ADDRESS_8_BITS = 0, - QSPI_ADDRESS_16_BITS, - QSPI_ADDRESS_24_BITS, - QSPI_ADDRESS_32_BITS, -} csi_qspi_address_size_t; - -/** - * \enum csi_qspi_alternate_bytes_size_t - * rief QSPI alternate bytes - */ -typedef enum { - QSPI_ALTERNATE_8_BITS = 0, - QSPI_ALTERNATE_16_BITS, - QSPI_ALTERNATE_24_BITS, - QSPI_ALTERNATE_32_BITS, -} csi_qspi_alt_size_t; - -/** QSPI command - * - * Defines a frame format. It consists of instruction, address, alternative, dummy count and data - */ -typedef struct { - struct { - csi_qspi_bus_width_t bus_width; ///< Bus width for the instruction - uint8_t value; ///< Instruction value - bool disabled; ///< Instruction phase skipped if disabled is set to true - } instruction; - struct { - csi_qspi_bus_width_t bus_width; ///< Bus width for the address - csi_qspi_address_size_t size; ///< Address size - uint32_t value; ///< Address value - bool disabled; ///< Address phase skipped if disabled is set to true - } address; - struct { - csi_qspi_bus_width_t bus_width; ///< Bus width for alternative - csi_qspi_alt_size_t size; ///< Alternative size - uint32_t value; ///< Alternative value - bool disabled; ///< Alternative phase skipped if disabled is set to true - } alt; - uint8_t dummy_count; ///< Dummy cycles count - struct { - csi_qspi_bus_width_t bus_width; ///< Bus width for data - } data; - uint8_t ddr_enable; -} csi_qspi_command_t; - -/** - * \enum csi_qspi_event_t - * \brief QSPI event - */ -typedef enum { - QSPI_EVENT_COMMAND_COMPLETE = 0, ///< Command completed - QSPI_EVENT_ERROR, ///< An error has occurred -} csi_qspi_event_t; - -/** - * \struct csi_qspi_t - * \brief QSPI Handle Structure definition - */ - -typedef struct csi_qspi csi_qspi_t; -struct csi_qspi { - csi_dev_t dev; ///< QSPI hw-device info - void (*callback)(csi_qspi_t *qspi, csi_qspi_event_t event, void *arg); ///< User callback function - void *arg; ///< QSPI custom designed param passed to evt_cb - uint8_t *tx_data; ///< Pointer to QSPI Tx transfer Buffer - uint32_t tx_size; ///< QSPI Tx Transfer size - uint8_t *rx_data; ///< Pointer to QSPI Rx transfer Buffer - uint32_t rx_size; ///< QSPI Rx Transfer size - void *send; ///< The send_async func - void *receive; ///< The receive_async func - void *send_receive; ///< The send_receive_async func - csi_state_t state; ///< Peripheral state - csi_dma_ch_t *tx_dma; - csi_dma_ch_t *rx_dma; - void *priv; -}; - -/** - \brief Init QSPI ctrl block - 1. Initializes the QSPI mode according to the specified parameters in the csi_qspi_init_t - 2. Registers event callback function and user param for the callback - \param[in] qspi Handle of QSPI instance - \param[in] idx Index of instance - \return Error code -*/ -csi_error_t csi_qspi_init(csi_qspi_t *qspi, uint32_t idx); - - -/** - \brief De-initialize QSPI Instance - stops operation and releases the software resources used by the Instance - \param[in] qspi Handle of QSPI instance -*/ -void csi_qspi_uninit(csi_qspi_t *qspi); - -/** - \brief Attach the callback handler to QSPI - \param[in] qspi Operate handle - \param[in] callback Callback function - \param[in] arg User can define it by himself as callback's param - \return Error code -*/ -csi_error_t csi_qspi_attach_callback(csi_qspi_t *qspi, void *callback, void *arg); - -/** - \brief Detach the callback handler - \param[in] qspi Operate handle - \return None -*/ -void csi_qspi_detach_callback(csi_qspi_t *qspi); - -/** - \brief Config qspi frequence - \param[in] qspi Handle of qspi instance - \param[in] hz QSPI frequence - \return The actual config frequency -*/ -uint32_t csi_qspi_frequence(csi_qspi_t *qspi, uint32_t hz); - -/** - \brief Config qspi mode - \param[in] qspi Handle of qspi instance - \param[in] mode QSPI mode - \return Error code -*/ -csi_error_t csi_qspi_mode(csi_qspi_t *qspi, csi_qspi_mode_t mode); - -/** - \brief Send an amount of data in blocking mode - \param[in] qspi QSPI handle - \param[in] cmd Structure that contains the command configuration information - \param[in] data Pointer to data buffer - \param[in] size Size of data to send - \param[in] timeout Time out duration - \return If send successful, this function shall return the num of data witch is sent successful - otherwise, the function shall return error code - */ -int32_t csi_qspi_send(csi_qspi_t *qspi, csi_qspi_command_t *cmd, const void *data, uint32_t size, uint32_t timeout); - -/** - \brief Receive an amount of data in blocking mode - \param[in] qspi QSPI handle - \param[in] cmd Structure that contains the command configuration information - \param[out] data Pointer to data buffer - \param[in] size Size of data items to receive - \param[in] timeout Time out duration - \return If receive successful, this function shall return the num of data witch is received successfulful - otherwise, the function shall return error code - */ -int32_t csi_qspi_receive(csi_qspi_t *qspi, csi_qspi_command_t *cmd, void *data, uint32_t size, uint32_t timeout); - -/** - \brief Transfer an amount of data in blocking mode - \param[in] qspi QSPI handle - \param[in] cmd Structure that contains the command configuration information - \param[in] tx_data Pointer to send data buffer - \param[out] rx_data Pointer to receive data buffer - \param[in] size Size of data to transfer - \param[in] timeout Time out duration - \return If transfer successful, this function shall return the num of data witch is transfer successfulful - otherwise, the function shall return error code - */ -int32_t csi_qspi_send_receive(csi_qspi_t *qspi, csi_qspi_command_t *cmd, const void *tx_data, void *rx_data, uint32_t size, uint32_t timeout); - -/** - \brief Send an amount of data in async mode - \param[in] qspi QSPI handle - \param[in] cmd Structure that contains the command configuration information - \param[in] data Pointer to data buffer - \param[in] size Size of data to send - \return Data number send - */ -csi_error_t csi_qspi_send_async(csi_qspi_t *qspi, csi_qspi_command_t *cmd, const void *data, uint32_t size); - -/** - \brief Receive an amount of data in async mode - \param[in] qspi QSPI handle - \param[in] cmd Structure that contains the command configuration information - \param[out] data Pointer to data buffer - \param[in] size Size of data items to receive - \return Data number received - */ -csi_error_t csi_qspi_receive_async(csi_qspi_t *qspi, csi_qspi_command_t *cmd, void *data, uint32_t size); - -/** - \brief Transfer an amount of data in async mode - \param[in] qspi QSPI handle - \param[in] cmd Structure that contains the command configuration information - \param[in] tx_data Pointer to send data buffer - \param[out] rx_data Pointer to receive data buffer - \param[in] size Size of data to transfer - \return Data number transfered - */ -csi_error_t csi_qspi_send_receive_async(csi_qspi_t *qspi, csi_qspi_command_t *cmd, const void *tx_data, void *rx_data, uint32_t size); - -/** - \brief Link DMA channel to qspi device - \param[in] qspi QSPI handle to operate - \param[in] tx_dma The DMA channel handle for send, when it is NULL means to unlink the channel - \param[in] rx_dma The DMA channel handle for receive, when it is NULL means to unlink the channel - \return Error code -*/ -csi_error_t csi_qspi_link_dma(csi_qspi_t *qspi, csi_dma_ch_t *tx_dma, csi_dma_ch_t *rx_dma); - -/** - \brief Get the state of qspi device - \param[in] qspi QSPI handle - \param[in] state QSPI state \ref csi_state_t - \return Error code - */ -csi_error_t csi_qspi_get_state(csi_qspi_t *qspi, csi_state_t *state); - -/** - \brief Comfigure the memory mapped mode - \param[in] qspi QSPI handle - \param[in] cmd Structure that contains the command configuration information - \return Error code - */ -csi_error_t csi_qspi_memory_mapped(csi_qspi_t *qspi, csi_qspi_command_t *cmd); - -/** - \brief Enable qspi power manage - \param[in] qspi QSPI handle to operate - \return Error code -*/ -csi_error_t csi_qspi_enable_pm(csi_qspi_t *qspi); - -/** - \brief Disable qspi power manage - \param[in] qspi QSPI handle to operate - \return None -*/ -void csi_qspi_disable_pm(csi_qspi_t *qspi); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_QSPI_H_*/ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/ringbuf.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/ringbuf.h deleted file mode 100755 index e5006e16..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/ringbuf.h +++ /dev/null @@ -1,62 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** -* @file ringbuffer.h -* @brief header file for ringbuffer Driver -* @version V1.0 -* @date August 15. 2019 -******************************************************************************/ -#ifndef _RING_BUFFER_H_ -#define _RING_BUFFER_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stdint.h" -#include <stdbool.h> - -typedef struct ringbuffer { - uint8_t *buffer; - uint32_t size; - uint32_t write; - uint32_t read; - uint32_t data_len; -} csi_ringbuf_t; - -void csi_ringbuf_reset(csi_ringbuf_t *fifo); -uint32_t csi_ringbuf_len(csi_ringbuf_t *fifo); -uint32_t csi_ringbuf_avail(csi_ringbuf_t *fifo); -bool csi_ringbuf_is_empty(csi_ringbuf_t *fifo); -bool csi_ringbuf_is_full(csi_ringbuf_t *fifo); - -/*write to ringbuffer*/ -uint32_t csi_ringbuf_in(csi_ringbuf_t *fifo, const void *in, uint32_t len); - -/*read to ringbuffer*/ -uint32_t csi_ringbuf_out(csi_ringbuf_t *fifo, void *out, uint32_t len); - -/*move to another ringbuffer*/ -uint32_t csi_ringbuf_move(csi_ringbuf_t *fifo_in, csi_ringbuf_t *fifo_out); - -#ifdef __cplusplus -} -#endif - -#endif /* _RING_BUFFER_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/rng.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/rng.h deleted file mode 100755 index 11e03f44..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/rng.h +++ /dev/null @@ -1,54 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/tng.h - * @brief Header File for RNG Driver - * @version V1.0 - * @date 22. Apr 2020 - * @model tng - ******************************************************************************/ -#ifndef _DRV_TNG_H_ -#define _DRV_TNG_H_ - -#include "drv/common.h" -#include <stdint.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - \brief Get data from the TNG engine - \param[out] Data Pointer to buffer with data get from TNG - \param[in] Num Number of data items,uinit in uint32 - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rng_get_multi_word(uint32_t *data, uint32_t num); - -/** - \brief Get data from the TNG engine - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rng_get_single_word(uint32_t* data); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_TNG_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/rsa.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/rsa.h deleted file mode 100755 index ea5b005d..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/rsa.h +++ /dev/null @@ -1,198 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/****************************************************************************** - * @file drv/rsa.h - * @brief Header File for RSA Driver - * @version V1.0 - * @date 02. June 2020 - * @model rsa - ******************************************************************************/ -#ifndef _DRV_RSA_H_ -#define _DRV_RSA_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <stdint.h> -#include <drv/common.h> - -/*----- RSA Control Codes: Mode Parameters: Key Bits -----*/ -/****** RSA Key bits Type *****/ -typedef enum { - RSA_KEY_BITS_192 = 0U, /* 192 Key bits */ - RSA_KEY_BITS_256, /* 256 Key bits */ - RSA_KEY_BITS_512, /* 512 Key bits */ - RSA_KEY_BITS_1024, /* 1024 Key bits */ - RSA_KEY_BITS_2048, /* 2048 Key bits */ - RSA_KEY_BITS_3072, /* 3072 Key bits */ - RSA_KEY_BITS_4096 /* 4096 Key bits */ -} csi_rsa_key_bits_t; - -/****** RSA Padding Type *****/ -typedef enum { - RSA_PADDING_MODE_NO = 0, /* RSA NO Padding Mode */ - RSA_PADDING_MODE_PKCS1, /* RSA PKCS1 Padding Mode */ - RSA_PADDING_MODE_PKCS1_OAEP, /* RSA PKCS1 OAEP Padding Mode */ - RSA_PADDING_MODE_SSLV23, /* RSA SSLV23 Padding Mode */ - RSA_PADDING_MODE_X931, /* RSA X931 Padding Mode */ - RSA_PADDING_MODE_PSS /* RSA PSS Padding Mode */ -} csi_rsa_padding_type_t; - -/****** RSA Hash Type *****/ -typedef enum { - RSA_HASH_TYPE_MD5 = 0, - RSA_HASH_TYPE_SHA1, - RSA_HASH_TYPE_SHA224, - RSA_HASH_TYPE_SHA256, - RSA_HASH_TYPE_SHA384, - RSA_HASH_TYPE_SHA512 -} csi_rsa_hash_type_t; - -/****** RSA Context *****/ -typedef struct { - void *n; /* Pointer to the public modulus */ - void *e; /* Pointer to the public exponent */ - void *d; /* Pointer to the private exponent */ - csi_rsa_key_bits_t key_bits; /* RSA KEY BITS */ - csi_rsa_padding_type_t padding_type; /* RSA PADDING TYPE */ -} csi_rsa_context_t; - -/****** RSA State *****/ -typedef struct { - uint8_t busy : 1; /* Calculate busy flag */ - uint8_t error : 1; /* Calculate error flag */ -} csi_rsa_state_t; - -/****** RSA Ctrl *****/ -typedef struct { - csi_dev_t dev; - void *cb; - void *arg; - csi_rsa_state_t state; - void *prim; -} csi_rsa_t; - -/****** RSA Moddle *****/ -typedef struct { - uint32_t pout[64]; - uint8_t *pouts; - uint32_t *pout_size; - uint32_t u32keywords; - uint8_t *pdst; - uint32_t u32padding; - uint32_t u32dst_words; - uint32_t u32type; - uint32_t rsa_state; -}rsa_middle_t; - -/****** RSA Event *****/ -typedef enum { - RSA_EVENT_COMPLETE = 0, /* rsa event completed */ - RSA_EVENT_VERIFY_SUCCESS, /* rsa event verify success */ - RSA_EVENT_VERIFY_FAILED, /* rsa event verify failed */ - RSA_EVENT_ERROR, /* rsa event error */ -} csi_rsa_event_t; - -typedef void (*csi_rsa_callback_t)(csi_rsa_t *rsa, csi_rsa_event_t event, void *arg); ///< Pointer to \ref csi_rsa_callback_t : RSA Event call back. - -/** - \brief Initialize RSA Interface. 1. Initializes the resources needed for the RSA interface 2.registers event callback function - \param[in] rsa RSA handle to operate. - \param[in] idx Device id - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rsa_init(csi_rsa_t *rsa, uint32_t idx); - -/** - \brief De-initialize RSA Interface. stops operation and releases the software resources used by the interface - \param[in] rsa RSA handle to operate. - \return none -*/ -void csi_rsa_uninit(csi_rsa_t *rsa); - -/** - \brief Generate rsa key pair. - \param[in] rsa RSA handle to operate. - \param[out] context Pointer to the rsa context - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rsa_gen_key(csi_rsa_t *rsa, csi_rsa_context_t *context); - -/** - \brief Encrypt - \param[in] rsa RSA handle to operate. - \param[in] context Pointer to the rsa context - \param[in] src Pointer to the source data. - \param[in] src_size The source data len - \param[out] out Pointer to the result buffer - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rsa_encrypt(csi_rsa_t *rsa, csi_rsa_context_t *context, void *src, uint32_t src_size, void *out); - -/** - \brief decrypt - \param[in] rsa RSA handle to operate. - \param[in] context Pointer to the rsa context - \param[in] src Pointer to the source data. - \param[in] src_size The source data len - \param[out] out Pointer to the result buffer - \param[out] out_size The result size - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rsa_decrypt(csi_rsa_t *rsa, csi_rsa_context_t *context, void *src, uint32_t src_size, void *out, uint32_t *out_size); - -/** - \brief RSA sign - \param[in] rsa RSA handle to operate. - \param[in] context Pointer to the rsa context - \param[in] src Pointer to the source data. - \param[in] src_size The source data len - \param[out] signature Pointer to the signature - \param[in] hash_type The source data hash type - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rsa_sign(csi_rsa_t *rsa, csi_rsa_context_t *context, void *src, uint32_t src_size, void *signature, csi_rsa_hash_type_t hash_type); - -/** - \brief RSA verify - \param[in] rsa RSA handle to operate. - \param[in] context Pointer to the rsa context - \param[in] src Pointer to the source data. - \param[in] src_size The source data len - \param[in] signature Pointer to the signature - \param[in] sig_size The signature size - \param[in] hash_type The source data hash type - \return Verify result -*/ -bool csi_rsa_verify(csi_rsa_t *rsa, csi_rsa_context_t *context, void *src, uint32_t src_size, void *signature, uint32_t sig_size, csi_rsa_hash_type_t hash_type); - -/** - \brief Get big prime data - \param[in] rsa RSA handle to operate. - \param[in] p Pointer to the prime - \param[in] bit_length Pointer to the prime bit length - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rsa_get_prime(csi_rsa_t *rsa, void *p, uint32_t bit_length); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_RSA_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/rtc.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/rtc.h deleted file mode 100755 index 29742f3c..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/rtc.h +++ /dev/null @@ -1,148 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/rtc.h - * @brief Header File for RTC Driver - * @version V1.0 - * @date 9. Oct 2020 - * @model rtc - ******************************************************************************/ - -#ifndef _DRV_RTC_H_ -#define _DRV_RTC_H_ - -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/****** RTC time ******/ -typedef struct { - int tm_sec; ///< Second. [0-59] - int tm_min; ///< Minute. [0-59] - int tm_hour; ///< Hour. [0-23] - int tm_mday; ///< Day. [1-31] - int tm_mon; ///< Month. [0-11] - int tm_year; ///< Year-1900. [70- ] !NOTE:Set 100 mean 2000 - int tm_wday; ///< Day of week. [0-6 ] !NOTE:Set 0 mean Sunday - int tm_yday; ///< Days in year.[0-365] !NOTE:Set 0 mean January 1st -} csi_rtc_time_t; - -/****** definition for RTC ******/ -typedef struct csi_rtc csi_rtc_t; - -struct csi_rtc { - csi_dev_t dev; - void (*callback)(csi_rtc_t *rtc, void *arg); - void *arg; - void *priv; -}; - -/** - \brief Initialize RTC interface. Initializes the resources needed for the RTC interface - \param[in] rtc Handle to operate - \param[in] idx RTC index - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rtc_init(csi_rtc_t *rtc, uint32_t idx); - -/** - \brief De-initialize RTC interface. Stops operation and releases the software resources used by the interface - \param[in] rtc Handle to operate - \return None -*/ -void csi_rtc_uninit(csi_rtc_t *rtc); - -/** - \brief Set system date and wait for synchro - \param[in] rtc Handle to operate - \param[in] rtctime Pointer to RTC time - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rtc_set_time(csi_rtc_t *rtc, const csi_rtc_time_t *rtctime); - -/** - \brief Set system date but no wait - \param[in] rtc Handle to operate - \param[in] rtctime Pointer to RTC time - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rtc_set_time_no_wait(csi_rtc_t *rtc, const csi_rtc_time_t *rtctime); - -/** - \brief Get system date - \param[in] rtc Handle to operate - \param[out] rtctime Pointer to RTC time - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rtc_get_time(csi_rtc_t *rtc, csi_rtc_time_t *rtctime); - -/** - \brief Get alarm remaining time - \param[in] rtc Handle to operate - \return The remaining time(s) -*/ -uint32_t csi_rtc_get_alarm_remaining_time(csi_rtc_t *rtc); - -/** - \brief Config RTC alarm timer - \param[in] rtc Handle to operate - \param[in] rtctime Time to wake up - \param[in] callback Callback function - \param[in] arg Callback's param - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rtc_set_alarm(csi_rtc_t *rtc, const csi_rtc_time_t *rtctime, void *callback, void *arg); - -/** - \brief Cancel the RTC alarm - \param[in] rtc Handle to operate - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rtc_cancel_alarm(csi_rtc_t *rtc); - -/** - \brief Judge RTC is running - \param[in] rtc Handle to operate - \return - true - RTC is running - false - RTC is not running -*/ -bool csi_rtc_is_running(csi_rtc_t *rtc); - -/** - \brief Enable RTC power manage - \param[in] rtc Handle to operate - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rtc_enable_pm(csi_rtc_t *rtc); - -/** - \brief Disable RTC power manage - \param[in] rtc Handle to operate - \return None -*/ -void csi_rtc_disable_pm(csi_rtc_t *rtc); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_RTC_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/sasc.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/sasc.h deleted file mode 100755 index 6a7f6a04..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/sasc.h +++ /dev/null @@ -1,144 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/sasc.h - * @brief Header File for SASC driver - * @version V1.0 - * @date 02. June 2020 - * @model sasc - ******************************************************************************/ -#ifndef _DRV_SASC_H_ -#define _DRV_SASC_H_ - - -#include <stdint.h> -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif -typedef enum { - SASC_RW = 0, - SASC_RO = 1, - SASC_WO = 2, - SASC_AP_DENY = 3 -} csi_sasc_ap_t; - -typedef enum { - SASC_DI = 0, - SASC_DO = 1, - SASC_IO = 2, - SASC_DI_DENY = 3 -} csi_sasc_di_t; - -typedef enum { - SASC_RAM_4B = 5, - SASC_RAM_8B = 6, - SASC_RAM_16B = 7, - SASC_RAM_32B = 8, - SASC_RAM_64B = 9, - SASC_RAM_128B = 10, - SASC_RAM_256B = 11, - SASC_RAM_512B = 12, - SASC_RAM_1KB = 13, - SASC_RAM_2KB = 14, - SASC_RAM_4KB = 15, - SASC_RAM_8KB = 16, - SASC_RAM_16KB = 17, - SASC_RAM_32KB = 18, - SASC_RAM_64KB = 19, - SASC_RAM_128KB = 20, -} csi_sasc_ram_size_t; - -typedef enum { - SASC_FLASH_1S = 0, - SASC_FLASH_2S, - SASC_FLASH_4S, - SASC_FLASH_8S, - SASC_FLASH_16S, - SASC_FLASH_32S, - SASC_FLASH_64S, - SASC_FLASH_128S, - SASC_FLASH_256S, - SASC_FLASH_512S, - SASC_FLASH_1024S, - SASC_FLASH_2048S -} csi_sasc_flash_size_t; - -typedef struct { - csi_sasc_ap_t super_ap; - csi_sasc_ap_t user_ap; - csi_sasc_di_t super_di; - csi_sasc_di_t user_di; - bool is_secure; -} csi_sasc_attr_t; - -/** - \brief Config the sasc ram region attribute. - \param[in] region_id Config region index - \param[in] base_addr Config region base address. - \param[in] size config region size. - \param[in] attr Region attr. - \return Error code -*/ -csi_error_t csi_sasc_ram_config(uint8_t region_id, uint32_t base_addr, csi_sasc_ram_size_t size, csi_sasc_attr_t attr); - -/** - \brief Config the sasc flash region attribute. - \param[in] region_id Config region index - \param[in] base_addr Config region base address. - \param[in] size Config region size. - \param[in] attr Region attr. - \return Error code -*/ -csi_error_t csi_sasc_flash_config(uint8_t region_id, uint32_t base_addr, csi_sasc_flash_size_t size, csi_sasc_attr_t attr); - -/** - \brief Enable sasc ram config. - \param[in] region_id Region index - \return error code -*/ -csi_error_t csi_sasc_ram_enable(uint8_t region_id); - -/** - \brief Enable sasc flash config - \param[in] region_id Config region index - \return error code -*/ -csi_error_t csi_sasc_flash_enable(uint8_t region_id); - -/** - \brief Disable sasc ram config. - \param[in] region_id Region index - \return error code -*/ -csi_error_t csi_sasc_ram_disable(uint8_t region_id); - -/** - \brief Disable sasc flash config - \param[in] region_id Region index - \return error code -*/ -csi_error_t csi_sasc_flash_disable(uint8_t region_id); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_SASC_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/sdif.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/sdif.h deleted file mode 100755 index 0508912b..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/sdif.h +++ /dev/null @@ -1,441 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/sdif.h - * @brief Header File for SDIF Driver - * @version V1.0 - * @date 28. June 2020 - * @model sdif - ******************************************************************************/ -#ifndef _DRV_SDIF_H_ -#define _DRV_SDIF_H_ - -#include <stdbool.h> -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void *sdif_handle_t; - -/*! @brief Construct a status code value from a group and code number. */ -#define MAKE_STATUS(group, code) ((((group)*100) + (code))) - -/*! @brief Status group numbers. */ -enum _status_groups { - kStatusGroup_Generic = 0, /*!< Group number for generic status codes. */ - kStatusGroup_SDMMC = 18, /*!< Group number for SDMMC status code */ - kStatusGroup_SDIF = 59, /*!< Group number for SDIF status codes.*/ - kStatusGroup_ApplicationRangeStart = 101, /*!< Starting number for application groups. */ -}; - -/*! @brief Generic status return codes. */ -enum _generic_status { - kStatus_Success = MAKE_STATUS(kStatusGroup_Generic, 0), - kStatus_Fail = MAKE_STATUS(kStatusGroup_Generic, 1), - kStatus_ReadOnly = MAKE_STATUS(kStatusGroup_Generic, 2), - kStatus_OutOfRange = MAKE_STATUS(kStatusGroup_Generic, 3), - kStatus_InvalidArgument = MAKE_STATUS(kStatusGroup_Generic, 4), - kStatus_Timeout = MAKE_STATUS(kStatusGroup_Generic, 5), - kStatus_NoTransferInProgress = MAKE_STATUS(kStatusGroup_Generic, 6), -}; - -/*! @brief SDIF status */ -enum _sdif_status { - kStatus_SDIF_DescriptorBufferLenError = MAKE_STATUS(kStatusGroup_SDIF, 0U), /*!< Set DMA descriptor failed */ - kStatus_SDIF_InvalidArgument = MAKE_STATUS(kStatusGroup_SDIF, 1U), /*!< invalid argument status */ - kStatus_SDIF_SyncCmdTimeout = MAKE_STATUS(kStatusGroup_SDIF, 2U), /*!< sync command to CIU timeout status */ - kStatus_SDIF_SendCmdFail = MAKE_STATUS(kStatusGroup_SDIF, 3U), /*!< send command to card fail */ - kStatus_SDIF_SendCmdErrorBufferFull = - MAKE_STATUS(kStatusGroup_SDIF, 4U), /*!< send command to card fail, due to command buffer full - user need to resend this command */ - kStatus_SDIF_DMATransferFailWithFBE = - MAKE_STATUS(kStatusGroup_SDIF, 5U), /*!< DMA transfer data fail with fatal bus error , - to do with this error :issue a hard reset/controller reset*/ - kStatus_SDIF_DMATransferDescriptorUnavailable = - MAKE_STATUS(kStatusGroup_SDIF, 6U), /*!< DMA descriptor unavailable */ - kStatus_SDIF_DataTransferFail = MAKE_STATUS(kStatusGroup_SDIF, 6U), /*!< transfer data fail */ - kStatus_SDIF_ResponseError = MAKE_STATUS(kStatusGroup_SDIF, 7U), /*!< response error */ - kStatus_SDIF_DMAAddrNotAlign = MAKE_STATUS(kStatusGroup_SDIF, 8U), /*!< DMA address not align */ -}; - -/*! @brief Type used for all status and error return values. */ -typedef int32_t status_t; - -/*! @brief Computes the number of elements in an array. */ -#if !defined(ARRAY_SIZE) -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) -#endif - -/*! Macro to change a value to a given size aligned value */ -#define SDK_SIZEALIGN(var, alignbytes) \ - ((unsigned int)((var) + ((alignbytes)-1)) & (unsigned int)(~(unsigned int)((alignbytes)-1))) - -///< #define assert(__e) ((void)0) -/*! @name Min/max macros */ -#if !defined(MIN) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif - -#if !defined(MAX) -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#endif - -#define SDK_ALIGN(var, alignbytes) var - -static inline unsigned long cpu_to_dma(unsigned long addr) -{ - return addr; -} - -static inline unsigned long *ptr_cpu_to_dma(unsigned long *addr) -{ - return (unsigned long *)cpu_to_dma((unsigned long)addr); -} - -typedef enum { - SDIF_ERROR_CMD_CRC_FAIL = (1), ///< Command response received (but CRC check failed) - SDIF_ERROR_DATA_CRC_FAIL, ///< Data block sent/received (CRC check failed) - SDIF_ERROR_CMD_RSP_TIMEOUT, ///< Command response timeout - SDIF_ERROR_DATA_TIMEOUT, ///< Data timeout - SDIF_ERROR_TX_UNDERRUN, ///< Transmit FIFO underrun - SDIF_ERROR_RX_OVERRUN, ///< Receive FIFO overrun - SDIF_ERROR_ADDR_MISALIGNED, ///< Misaligned address - SDIF_ERROR_BLOCK_LEN_ERR, ///< Transferred block length is not allowed for the card or the number of transferred bytes does not match the block length - SDIF_ERROR_ERASE_SEQ_ERR, ///< An error in the sequence of erase command occurs - SDIF_ERROR_BAD_ERASE_PARAM, ///< An invalid selection for erase groups - SDIF_ERROR_WRITE_PROT_VIOLATION, ///< Attempt to program a write protect block - SDIF_ERROR_LOCK_UNLOCK_FAILED, ///< Sequence or password error has been detected in unlock command or if there was an attempt to access a locked card - SDIF_ERROR_COM_CRC_FAILED, ///< CRC check of the previous command failed - SDIF_ERROR_ILLEGAL_CMD, ///< Command is not legal for the card state - SDIF_ERROR_CARD_ECC_FAILED, ///< Card internal ECC was applied but failed to correct the data - SDIF_ERROR_CC_ERR, ///< Internal card controller error - SDIF_ERROR_GENERAL_UNKNOWN_ERR, ///< General or unknown error - SDIF_ERROR_STREAM_READ_UNDERRUN, ///< The card could not sustain data reading in stream rmode - SDIF_ERROR_STREAM_WRITE_OVERRUN, ///< The card could not sustain data programming in stream mode - SDIF_ERROR_CID_CSD_OVERWRITE, ///< CID/CSD overwrite error - SDIF_ERROR_WP_ERASE_SKIP, ///< Only partial address space was erased - SDIF_ERROR_CARD_ECC_DISABLED, ///< Command has been executed without using internal ECC - SDIF_ERROR_ERASE_RESET, ///< Erase sequence was cleared before executing because an out - SDIF_ERROR_AKE_SEQ_ERR, ///< Error in sequence of authentication - SDIF_ERROR_INVALID_VOLTRANGE, ///< Error in case of invalid voltage range - SDIF_ERROR_ADDR_OUT_OF_RANGE, ///< Error when addressed block is out of range - SDIF_ERROR_REQUEST_NOT_APPLICABLE, ///< Error when command request is not applicable - SDIF_ERROR_UNSUPPORTED_FEATURE, ///< Error when feature is not insupported -} sdif_error_e; - -/* Host controller capabilities flag mask */ -typedef enum { - SDIF_SUPPORT_HIGH_SPEED = 0x1U, ///< Support high-speed - SDIF_SUPPORT_DMA_SPEED = 0x2U, ///< Support DMA - SDIF_SUPPORT_USPEND_RESUME = 0x4U, ///< Support suspend/resume - SDIF_SUPPORT_V330 = 0x8U, ///< Support voltage 3.3V - SDIF_SUPPORT_4BIT = 0x10U, ///< Support 4 bit mode - SDIF_SUPPORT_8BIT = 0x20U, ///< Support 8 bit mode -} sdif_capability_flag_e; - -/* \brief define the internal DMA mode */ -typedef enum { - SDIF_CHAIN_DMA_MODE = 0x01U, ///< one descriptor with one buffer,but one descriptor point to another - SDIF_DUAL_DMA_MODE = 0x02U, ///< dual mode is one descriptor with two buffer -} sdif_dma_mode_e; - -/* The command type */ -typedef enum { - SDIF_CARD_COMMAND_NORMAL = 0U, ///< Normal command - SDIF_CARD_COMMAND_SUSPEND = 1U, ///< Suspend command - SDIF_CARD_COMMAND_RESUME = 2U, ///< Resume command - SDIF_CARD_COMMAND_ABORT = 3U, ///< Abort command -} sdif_card_command_type_e; - -/* The command response type */ -typedef enum { - SDIF_CARD_RESPONSE_NONE = 0U, ///< Response type: none - SDIF_CARD_RESPONSE_R1 = 1U, ///< Response type: R1 - SDIF_CARD_RESPONSE_R1b = 2U, ///< Response type: R1b - SDIF_CARD_RESPONSE_R2 = 3U, ///< Response type: R2 - SDIF_CARD_RESPONSE_R3 = 4U, ///< Response type: R3 - SDIF_CARD_RESPONSE_R4 = 5U, ///< Response type: R4 - SDIF_CARD_RESPONSE_R5 = 6U, ///< Response type: R5 - SDIF_CARD_RESPONSE_R5b = 7U, ///< Response type: R5b - SDIF_CARD_RESPONSE_R6 = 8U, ///< Response type: R6 - SDIF_CARD_RESPONSE_R7 = 9U, ///< Response type: R7 -} sdif_card_response_type_e; - -/* \brief define the card bus width type */ -typedef enum { - SDIF_BUS_1BIT_WIDTH = 0U, ///< 1bit bus width, 1bit mode and 4bit mode share one register bit - SDIF_BUS_4BIT_WIDTH = 1U, ///< 4bit mode mask - SDIF_BUS_8BIT_WIDTH = 2U, ///< support 8 bit mode -} sdif_bus_width_e; - -/* \brief Defines the internal DMA configure structure. */ -typedef struct { - bool enable_fix_burst_len; ///< fix burst len enable/disable flag,When set, the AHB will - ///< use only SINGLE, INCR4, INCR8 or INCR16 during start of - ///< normal burst transfers. When reset, the AHB will use SINGLE - ///< and INCR burst transfer operations - - sdif_dma_mode_e mode; ///< define the DMA mode */ - - - uint32_t *dma_des_buffer_start_addr; ///< internal DMA descriptor start address - uint32_t dma_des_buffer_len; ///< internal DMA buffer descriptor buffer len ,user need to pay attention to the - ///< dma descriptor buffer length if it is bigger enough for your transfer - uint8_t dma_dws_skip_len; ///< define the descriptor skip length ,the length between two descriptor - ///< this field is special for dual DMA mode -} sdif_dma_config_t; - -/* \brief sdif callback functions. */ -typedef struct { - void (*card_inserted)(uint32_t idx, void *user_data); ///< card insert call back - void (*card_removed)(uint32_t idx, void *user_data); ///< card remove call back - void (*sdif_interrupt)(uint32_t idx, void *user_data); ///< SDIF card interrupt occurs - void (*dma_des_unavailable)(uint32_t idx, void *user_data);///< DMA descriptor unavailable - void (*command_reload)(uint32_t idx, void *user_data); ///< command buffer full,need re-load - void (*transfer_complete)(uint32_t idx, - void *state, - int32_t status, - void *user_data); ///<Transfer complete callback -} sdif_callback_t; - -/* Card data descriptor */ -typedef struct { - bool stream_transfer; ///< indicate this is a stream data transfer command - bool enable_auto_command12; ///< indicate if auto stop will send when data transfer over - bool enable_ignore_error; ///< indicate if enable ignore error when transfer data - - uint32_t block_size; ///< Block size, take care when configure this parameter - uint32_t block_count; ///< Block count - uint32_t *rx_date_buffer; ///< data buffer to receive - const uint32_t *tx_data_buffer; ///< data buffer to transfer -} sdif_data_t; - -/* Card command descriptor */ -typedef struct { - uint32_t index; ///< Command index - uint32_t argument; ///< Command argument - uint32_t response[4U]; ///< Response for this command - uint32_t type; ///< define the command type - uint32_t response_type; ///< Command response type - uint32_t flags; ///< Cmd flags - uint32_t resopnse_error_flags; ///< response error flags, need to check the flags when receive the cmd response -} sdif_command_t; -/* Transfer state */ -typedef struct { - sdif_data_t *data; ///< Data to transfer - sdif_command_t *command; ///< Command to send -} sdif_transfer_t; - -/* Data structure to initialize the sdif */ -typedef struct { - uint8_t response_timeout; ///< command response timeout value - uint32_t card_det_debounce_clock; ///< define the debounce clock count which will used in - /// card detect logic,typical value is 5-25ms - uint32_t endian_mode; ///< define endian mode ,this field is not used in this - /// module actually, keep for compatible with middleware - uint32_t data_timeout; ///< data timeout value -} sdif_config_t; - -/* - * \brief SDIF capability information. - * Defines a structure to get the capability information of SDIF. - */ -typedef struct { - uint32_t sd_version; ///< support SD card/SDIF version - uint32_t mmc_version; ///< support emmc card version - uint32_t max_block_length; ///< Maximum block length united as byte - uint32_t max_block_count; ///< Maximum byte count can be transfered - uint32_t flags; ///< Capability flags to indicate the support information -} sdif_capability_t; - -/** - \brief Initializes the SDIF according to the specified - \param[in] idx SDIF index - \param[in] callback Callback Structure pointer to contain all callback functions. - \param[in] user_data User_data Callback function parameter. - \return sdif Handle if success -*/ -sdif_handle_t csi_sdif_initialize(uint32_t idx, sdif_callback_t *callback, void *user_data); - -/** - \brief De-initialize SD Interface. stops operation and releases the software resources used by the interface - \param[in] handle SDIF handle to operate. -*/ -void csi_sdif_uninitialize(uint32_t idx, sdif_handle_t handle); - -/** - \brief Initializes the SDIF config - \param[in] idx SDIF index - \param[in] config SDIF config descriptor \ref sdif_config_t -*/ -void csi_sdif_config(sdif_handle_t handle, sdif_config_t *config); - -/** - \brief Get driver capabilities. - \param[in] handle SDIF handle to operate. - \param[out] capability SDIF capability information \ref sdif_capabilities_t - */ -void csi_sdif_get_capabilities(sdif_handle_t handle, sdif_capability_t *capability); - - -/** - \brief send command to the card - \param[in] handle SDIF handle to operate. - \param[in] cmd command configuration collection - \param[in] retries total number of tries - \return Error code - */ -int32_t csi_sdif_send_command(sdif_handle_t handle, sdif_command_t *cmd, uint32_t retries); - -/** - \brief SDIF transfer function data/cmd in a non-blocking way - this API should be use in interrupt mode, when use this API user - must call csi_sdif_create_state first, all status check through - interrupt - \param[in] handle SDIF handle to operate. - \param[in] dma_config DMA config structure \ref sdif_dma_config_t - This parameter can be config as: - 1. NULL - In this condition, polling transfer mode is selected - 2. avaliable DMA config - In this condition, DMA transfer mode is selected - \param[in] transfer SDIF transfer configuration collection. \ref sdif_transfer_t - \return Error code - */ -int32_t csi_sdif_transfer(sdif_handle_t handle, sdif_dma_config_t *dma_config, sdif_transfer_t *transfer); - -/** - \brief Poll-wait for the response to the last command to be ready. This - function should be called even after sending commands that have no - response (such as CMD0) to make sure that the hardware is ready to - receive the next command. - \param[in] handle SDIF handle to operate. - \param[in] cmd : The command that was sent. See 32-bit command definitions above. -*/ -void csi_sdif_transfer_abort(sdif_handle_t handle); - -/** - \brief Called after change in Bus width has been selected (via ACMD6). Most - controllers will need to perform some special operations to work - correctly in the new bus mode. - \param[in] handle SDIF handle to operate. - \param[in] bus_width Wide bus mode \ref sdif_bus_width_e. -*/ -void csi_sdif_bus_width(sdif_handle_t handle, sdif_bus_width_e bus_width); - -/** - \brief Set SDIF clocking - \param[in] Handle SDIF handle to operate. - \param[in] Target_hz card bus clock frequency united in Hz. - \return Error code -*/ -uint32_t csi_sdif_set_clock(sdif_handle_t handle, uint32_t target_hz); - -/** - \brief Get sdif handle - \param[in] Idx sdif index - \return SDIF handle -*/ -sdif_handle_t csi_sdif_get_handle(uint32_t idx); - -/** - \brief Get sdif index - \param[out] Handle SDIF handle to operate. - \return SDIF index -*/ -uint32_t csi_sdif_get_idx(sdif_handle_t handle); - -/** - \brief SDIF return the controller status - \param[in] handle SDIF handle to operate. - */ -uint32_t csi_sdif_get_controller_status(sdif_handle_t handle); - -/** - \brief SDIF send initialize 80 clocks for SD card after initial - \param[in] handle SDIF handle to operate. - \param[in] timeout millisecond - */ -bool csi_sdif_send_card_active(sdif_handle_t handle, uint32_t timeout); - -/** - \brief SDIF module enable/disable card clock. - \param[in] handle SDIF handle to operate. - \param[in] enable enable:true, disable:false - */ -void csi_sdif_enable_card_clock(sdif_handle_t handle, bool enable); - -/** - \brief SDIF enable interrupt - \param[in] handle SDIF handle to operate. - \param[in] mask interrupt mask - */ -void csi_sdif_enable_interrupt(sdif_handle_t handle, uint32_t mask); - -/** - \brief SDIF disable interrupt - \param[in] handle SDIF handle to operate. - \param[in] mask interrupt mask - */ -void csi_sdif_disable_interrupt(sdif_handle_t handle, uint32_t mask); - -/** - \brief SDIF enable card detect interrupt - \param[in] handle SDIF handle to operate. - */ -void csi_sdif_enable_card_detect_interrupt(sdif_handle_t handle); - -/** - \brief SDIF enable sdio interrupt - \param[in] handle SDIF handle to operate. - */ -void csi_sdif_enable_sdio_interrupt(sdif_handle_t handle); - -/** - \brief SDIF disable sdio interrupt - \param[in] handle SDIF handle to operate. - */ -void csi_sdif_disable_sdio_interrupt(sdif_handle_t handle); - -/** - \brief SDIF module detect card insert status function. - \param[in] handle SDIF handle to operate. - \param[in] data3 indicate use data3 as card insert detect pin - \return 1 card is inserted - * 0 card is removed - */ -uint32_t csi_sdif_detect_card_insert(sdif_handle_t handle, bool data3); - -/** - \brief enable/disable the card power. - * once turn power on, software should wait for regulator/switch - * ramp-up time before trying to initialize card. - \param[in] handle SDIF handle to operate. - \param[in] enable enable:true, disable:false - */ -void csi_sdif_enable_card_power(sdif_handle_t handle, bool enable); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_SDIF_H_ */ - diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/sensor.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/sensor.h deleted file mode 100755 index a6088d4e..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/sensor.h +++ /dev/null @@ -1,195 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file sensor.h - * @brief Header File for SENSOR Driver - * @version V1.0 - * @date 15. June 2020 - * @model sensor - ******************************************************************************/ - -#ifndef _DRV_SENSOR_H_ -#define _DRV_SENSOR_H_ - -#include <soc.h> -#include <csi_core.h> -#include <drv/common.h> - - -typedef enum { - SENSOR_VDS_3V3_3V3 = 1, - SENSOR_VDS_2V5_3V3, - SENSOR_VDS_1V8_1V8, - SENSOR_VDS_1V5_1V8, - SENSOR_VDS_1V2_1V2, - SENSOR_VDS_1V1_1V2 -}drv_sensor_vds_t; - -typedef enum { - SENSOR_VHS_RANGE_15 = 0, - SENSOR_VHS_RANGE_12, - SENSOR_VHS_RANGE_9, - SENSOR_VHS_RANGE_6, -}drv_sensor_vhs_t; - -typedef enum { - SENSOR_VLS_RANGE_6 = 0, - SENSOR_VLS_RANGE_9, - SENSOR_VLS_RANGE_12, - SENSOR_VLS_RANGE_15, -}drv_sensor_vls_t; - -typedef enum { - SENSOR_TDHS_NEG_55 = 0, ///< -55 - SENSOR_TDHS_NEG_50, - SENSOR_TDHS_NEG_45, - SENSOR_TDHS_NEG_40, - SENSOR_TDHS_NEG_35, - SENSOR_TDHS_NEG_30, - SENSOR_TDHS_NEG_25, - SENSOR_TDHS_NEG_20, - SENSOR_TDHS_NEG_15, - SENSOR_TDHS_NEG_10, - SENSOR_TDHS_NEG_5, - SENSOR_TDHS_NEG_0, - SENSOR_TDHS_POS_5, ///< +5 - SENSOR_TDHS_POS_10, - SENSOR_TDHS_POS_15, - SENSOR_TDHS_POS_20, - SENSOR_TDHS_POS_25, - SENSOR_TDHS_POS_30, - SENSOR_TDHS_POS_35, - SENSOR_TDHS_POS_40, - SENSOR_TDHS_POS_45, - SENSOR_TDHS_POS_50, - SENSOR_TDHS_POS_55, - SENSOR_TDHS_POS_60, - SENSOR_TDHS_POS_65, - SENSOR_TDHS_POS_70, - SENSOR_TDHS_POS_75, - SENSOR_TDHS_POS_80, - SENSOR_TDHS_POS_85, - SENSOR_TDHS_POS_90, - SENSOR_TDHS_POS_95, - SENSOR_TDHS_POS_100, - SENSOR_TDHS_POS_105, - SENSOR_TDHS_POS_110, - SENSOR_TDHS_POS_115, - SENSOR_TDHS_POS_120, - SENSOR_TDHS_POS_125 -}drv_sensor_tdhs_t; - -typedef enum { - SENSOR_TDLS_NEG_55 = 0, ///< -55 - SENSOR_TDLS_NEG_50, - SENSOR_TDLS_NEG_45, - SENSOR_TDLS_NEG_40, - SENSOR_TDLS_NEG_35, - SENSOR_TDLS_NEG_30, - SENSOR_TDLS_NEG_25, - SENSOR_TDLS_NEG_20, - SENSOR_TDLS_NEG_15, - SENSOR_TDLS_NEG_10, - SENSOR_TDLS_NEG_5, - SENSOR_TDLS_NEG_0, - SENSOR_TDLS_POS_5, ///< +5 - SENSOR_TDLS_POS_10, - SENSOR_TDLS_POS_15, - SENSOR_TDLS_POS_20, -}drv_sensor_tdls_t; - -typedef enum { - SENSOR_FHS_RANGE_50 = 0, - SENSOR_FHS_RANGE_30, - SENSOR_FHS_RANGE_10, - SENSOR_FHS_RANGE_5, -}drv_sensor_fhs_t; - -typedef enum { - SENSOR_FLS_RANGE_50 = 0, - SENSOR_FLS_RANGE_30, - SENSOR_FLS_RANGE_10, - SENSOR_FLS_RANGE_5, -}drv_sensor_fls_t; - -typedef enum { - SENSOR_FHS_FREQ_33M = 0, - SENSOR_FHS_FREQ_66M, - SENSOR_FHS_FREQ_24M, - SENSOR_FHS_FREQ_12M, - SENSOR_FHS_FREQ_99M, - SENSOR_FHS_FREQ_198M, - SENSOR_FHS_FREQ_72M, - SENSOR_FHS_FREQ_36M, -}drv_sensor_freq_t; - -typedef enum { - SENSOR_WARN_H = 0, - SENSOR_WARN_L, - SENSOR_WARN_RST, -}drv_sensor_warn_t; - -/** - \brief Initialize Sensor VD - \param[in] vds Voltage range - \param[in] vhs Voltage high threshold - \param[in] vls Voltage low threshold - \param[in] vtm Used to modify the threshold value of the voltage detection point - \return Error code -*/ -csi_error_t drv_sensor_vd_init(drv_sensor_vds_t vds,drv_sensor_vhs_t vhs,drv_sensor_vls_t vls,uint8_t vtm); - -/** - \brief Get vd warn - \param[in] warn Vd warn select - \return Vd warn code -*/ -uint32_t drv_sensor_vd_get_warn(drv_sensor_warn_t warn); - -/** - \brief Initialize Sensor td - \param[in] hs Temp high threshold - \param[in] ls Temp low threshold - \return Error code -*/ -csi_error_t drv_sensor_td_init(drv_sensor_tdhs_t hs,drv_sensor_tdls_t ls); - -/** - \brief Get td warn - \param[in] warn Td warn select - \return Td warn code -*/ -uint32_t drv_sensor_td_get_warn(drv_sensor_warn_t warn); - -/** - \brief Initialize Sensor FD - \param[in] hs Temp high threshold - \param[in] ls Temp low threshold - \return Error code -*/ -csi_error_t drv_sensor_fd_init(drv_sensor_freq_t freq,drv_sensor_fhs_t fhs,drv_sensor_fls_t fls); - -/** - \brief Get fd warn - \param[in] warn Fd warn select - \return FD warn code -*/ -uint32_t drv_sensor_fd_get_warn(drv_sensor_warn_t warn); - -#endif /* _DRV_SENSOR_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/sha.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/sha.h deleted file mode 100755 index 668b9dcc..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/sha.h +++ /dev/null @@ -1,128 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/sha.h - * @brief Header File for SHA Driver - * @version V1.0 - * @date 9. Oct 2020 - * @model sha - ******************************************************************************/ - -#ifndef _DRV_SHA_H_ -#define _DRV_SHA_H_ - -#include <drv/common.h> -#include <drv/dma.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/****** SHA mode ******/ -typedef enum { - SHA_MODE_1 = 1U, /* SHA_1 mode */ - SHA_MODE_256, /* SHA_256 mode */ - SHA_MODE_224, /* SHA_224 mode */ - SHA_MODE_512, /* SHA_512 mode */ - SHA_MODE_384, /* SHA_384 mode */ - SHA_MODE_512_256, /* SHA_512_256 mode */ - SHA_MODE_512_224, /* SHA_512_224 mode */ - SHA_MODE_MD5 /* MD5 mode */ -} csi_sha_mode_t; - -/****** SHA State ******/ -typedef struct { - uint32_t busy : 1; /* Calculate busy flag */ - uint32_t error : 1; /* Calculate error flag */ -} csi_sha_state_t; - -/****** SHA Context ******/ -typedef struct { - csi_sha_mode_t mode; /* SHA mode */ - uint32_t total[2]; /* Number of bytes processed */ - uint32_t state[16]; /* Intermediate digest state */ - uint8_t buffer[128]; /* Data block being processed */ -} csi_sha_context_t; - -/****** SHA Event ******/ -typedef enum { - SHA_EVENT_COMPLETE = 0U, /*Calculate completed*/ - SHA_EVENT_ERROR /*Calculate error*/ -} csi_sha_event_t; - -/****** SHA Ctrl ******/ -typedef struct csi_sha csi_sha_t; -struct csi_sha{ - csi_dev_t dev; - void (*callback)(csi_sha_t *sha, csi_sha_event_t event, void *arg); /* SHA event callback for user */ - void *arg; /* SHA custom designed param passed to evt_cb */ - csi_dma_ch_t *dma_in; /* SHA in dma handle param */ - csi_sha_state_t state; /* SHA state */ - void *priv; -}; - -/** - \brief Initialize SHA Interface. Initializes the resources needed for the SHA interface - \param[in] sha Operate handle - \param[in] idx Index of SHA - \return Error code \ref csi_error_t -*/ -csi_error_t csi_sha_init(csi_sha_t *sha, uint32_t idx); - -/** - \brief De-initialize SHA Interface. Stops operation and releases the software resources used by the interface - \param[in] sha SHA handle to operate - \return None -*/ -void csi_sha_uninit(csi_sha_t *sha); - -/** - \brief Start the engine - \param[in] sha Handle to operate - \param[in] context Pointer to the SHA context \ref csi_sha_context_t - \param[in] mode SHA mode \ref csi_sha_mode_t - \return Error code \ref csi_error_t -*/ -csi_error_t csi_sha_start(csi_sha_t *sha, csi_sha_context_t *context, csi_sha_mode_t mode); - -/** - \brief Update the engine - \param[in] sha Handle to operate - \param[in] context Pointer to the SHA context \ref csi_sha_context_t - \param[in] input Pointer to the Source data - \param[in] size The data size - \return Error code \ref csi_error_t -*/ -csi_error_t csi_sha_update(csi_sha_t *sha, csi_sha_context_t *context, const void *input, uint32_t size); - -/** - \brief Finish the engine - \param[in] sha Handle to operate - \param[in] context Pointer to the SHA context \ref csi_sha_context_t - \param[out] output Pointer to the result data - \param[out] out_size Pointer to the result data size(bytes) - \return Error code \ref csi_error_t -*/ -csi_error_t csi_sha_finish(csi_sha_t *sha, csi_sha_context_t *context, void *output, uint32_t *out_size); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_SHA_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/spi.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/spi.h deleted file mode 100755 index 80f7e4d3..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/spi.h +++ /dev/null @@ -1,293 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/spi.h - * @brief Header File for SPI Driver - * @version V1.0 - * @date 08. Apr 2020 - * @model spi - ******************************************************************************/ - -#ifndef _DRV_SPI_H_ -#define _DRV_SPI_H_ - -#include <stdint.h> -#include <drv/common.h> -#include <drv/gpio.h> -#include <drv/dma.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \enum csi_spi_mode_t - * \brief Function mode of spi - */ -typedef enum { - SPI_MASTER, ///< SPI Master (Output on MOSI, Input on MISO); arg = Bus Speed in bps - SPI_SLAVE, ///< SPI Slave (Output on MISO, Input on MOSI) -} csi_spi_mode_t; - -/** - * \enum csi_spi_frame_len_t - * \brief SPI data width (4bit ~ 16bit) - */ -typedef enum { - SPI_FRAME_LEN_4 = 4, - SPI_FRAME_LEN_5, - SPI_FRAME_LEN_6, - SPI_FRAME_LEN_7, - SPI_FRAME_LEN_8, - SPI_FRAME_LEN_9, - SPI_FRAME_LEN_10, - SPI_FRAME_LEN_11, - SPI_FRAME_LEN_12, - SPI_FRAME_LEN_13, - SPI_FRAME_LEN_14, - SPI_FRAME_LEN_15, - SPI_FRAME_LEN_16 -} csi_spi_frame_len_t; - -/** - * \enum csi_spi_format_t - * \brief Timing format of spi - */ -typedef enum { - SPI_FORMAT_CPOL0_CPHA0 = 0, ///< Clock Polarity 0, Clock Phase 0 - SPI_FORMAT_CPOL0_CPHA1, ///< Clock Polarity 0, Clock Phase 1 - SPI_FORMAT_CPOL1_CPHA0, ///< Clock Polarity 1, Clock Phase 0 - SPI_FORMAT_CPOL1_CPHA1, ///< Clock Polarity 1, Clock Phase 1 -} csi_spi_cp_format_t; - -/** - * \enum csi_spi_event_t - * \brief Signaled event for user by driver - */ -typedef enum { - SPI_EVENT_SEND_COMPLETE, ///< Data Send completed. Occurs after call to csi_spi_send_async to indicate that all the data has been send over - SPI_EVENT_RECEIVE_COMPLETE, ///< Data Receive completed. Occurs after call to csi_spi_receive_async to indicate that all the data has been received - SPI_EVENT_SEND_RECEIVE_COMPLETE, ///< Data Send_receive completed. Occurs after call to csi_spi_send_receive_async to indicate that all the data has been send_received - SPI_EVENT_ERROR_OVERFLOW, ///< Data overflow: Receive overflow - SPI_EVENT_ERROR_UNDERFLOW, ///< Data underflow: Transmit underflow - SPI_EVENT_ERROR ///< Master Mode Fault (SS deactivated when Master).Occurs in master mode when Slave Select is deactivated and indicates Master Mode Fault -} csi_spi_event_t; - -/** - * \struct csi_spi_t - * \brief Ctrl block of spi instance - */ -typedef struct csi_spi csi_spi_t; -struct csi_spi { - csi_dev_t dev; ///< Hw-device info - void (*callback)(csi_spi_t *spi, csi_spi_event_t event, void *arg); ///< User callback ,signaled by driver event - void *arg; ///< User private param ,passed to user callback - uint8_t *tx_data; ///< Output data buf - uint32_t tx_size; ///< Output data size specified by user - uint8_t *rx_data; ///< Input data buf - uint32_t rx_size; ///< Input data size specified by user - csi_error_t (*send)(csi_spi_t *spi, const void *data, uint32_t size); ///< The send_async func - csi_error_t (*receive)(csi_spi_t *spi, void *data, uint32_t size); ///< The receive_async func - csi_error_t (*send_receive)(csi_spi_t *spi, const void *data_out, void *data_in, uint32_t size); ///< The send_receive_async func - csi_state_t state; ///< Peripheral state - csi_dma_ch_t *tx_dma; - csi_dma_ch_t *rx_dma; - void *priv; -}; - -/** - \brief Initialize SPI Interface - Initialize the resources needed for the SPI instance - \param[in] spi SPI handle - \param[in] idx SPI instance index - \return Error code -*/ -csi_error_t csi_spi_init(csi_spi_t *spi, uint32_t idx); - -/** - \brief De-initialize SPI Interface - stops Operation and releases the software resources used by the spi instance - \param[in] spi Handle - \return None -*/ -void csi_spi_uninit(csi_spi_t *spi); - -/** - \brief Attach the callback handler to SPI - \param[in] spi Operate handle - \param[in] callback Callback function - \param[in] arg User can define it by himself as callback's param - \return Error code -*/ -csi_error_t csi_spi_attach_callback(csi_spi_t *spi, void *callback, void *arg); - -/** - \brief Detach the callback handler - \param[in] spi Operate handle - \return None -*/ -void csi_spi_detach_callback(csi_spi_t *spi); - -/** - \brief Config spi mode (master or slave) - \param[in] spi SPI handle - \param[in] mode The mode of spi (master or slave) - \return Error code -*/ -csi_error_t csi_spi_mode(csi_spi_t *spi, csi_spi_mode_t mode); - -/** - \brief Config spi cp format - \param[in] spi SPI handle - \param[in] format SPI cp format - \return Error code -*/ -csi_error_t csi_spi_cp_format(csi_spi_t *spi, csi_spi_cp_format_t format); - -/** - \brief Config spi frame len - \param[in] spi SPI handle - \param[in] length SPI frame len - \return Error code -*/ -csi_error_t csi_spi_frame_len(csi_spi_t *spi, csi_spi_frame_len_t length); - -/** - \brief Config spi work frequence - \param[in] spi SPI handle - \param[in] baud SPI work baud - \return the actual config frequency -*/ -uint32_t csi_spi_baud(csi_spi_t *spi, uint32_t baud); - -/** - \brief Sending data to SPI transmitter,(received data is ignored) - blocking mode ,return unti all data has been sent or err happened - \param[in] spi Handle to operate - \param[in] data Pointer to buffer with data to send to SPI transmitter - \param[in] size Number of data to send(byte) - \param[in] timeout Unit in mini-second - \return If send successful, this function shall return the num of data witch is sent successful - otherwise, the function shall return Error code -*/ -int32_t csi_spi_send(csi_spi_t *spi, const void *data, uint32_t size, uint32_t timeout); - -/** - \brief Sending data to SPI transmitter,(received data is ignored) - non-blocking mode,transfer done event will be signaled by driver - \param[in] spi Handle to operate - \param[in] data Pointer to buffer with data to send to SPI transmitter - \param[in] size Number of data items to send(byte) - \return Error code -*/ -csi_error_t csi_spi_send_async(csi_spi_t *spi, const void *data, uint32_t size); - -/** - \brief Receiving data from SPI receiver - blocking mode, return untill curtain data items are readed - \param[in] spi Handle to operate - \param[out] data Pointer to buffer for data to receive from SPI receiver - \param[in] size Number of data items to receive(byte) - \param[in] timeout Unit in mini-second - \return If receive successful, this function shall return the num of data witch is received successful - otherwise, the function shall return Error code -*/ -int32_t csi_spi_receive(csi_spi_t *spi, void *data, uint32_t size, uint32_t timeout); - -/** - \brief Receiving data from SPI receiver - not-blocking mode, event will be signaled when receive done or err happend - \param[in] spi Handle to operate - \param[out] data Pointer to buffer for data to receive from SPI receiver - \param[in] size Number of data items to receive(byte) - \return Error code -*/ -csi_error_t csi_spi_receive_async(csi_spi_t *spi, void *data, uint32_t size); - -/** - \brief Dulplex,sending and receiving data at the same time - \ref csi_spi_event_t is signaled when operation completes or error happens - \ref csi_spi_get_state can get operation status - blocking mode, this function returns after operation completes or error happens - \param[in] spi SPI handle to operate - \param[in] data_out Pointer to buffer with data to send to SPI transmitter - \param[out] data_in Pointer to buffer for data to receive from SPI receiver - \param[in] size Data size(byte) - \return If transfer successful, this function shall return the num of data witch is transfer successful, - otherwise, the function shall return Error code -*/ -int32_t csi_spi_send_receive(csi_spi_t *spi, const void *data_out, void *data_in, uint32_t size, uint32_t timeout); - -/** - \brief Transmit first then receive ,receive will begin after transmit is done - if non-blocking mode, this function only starts the transfer, - \ref csi_spi_event_t is signaled when operation completes or error happens - \ref csi_spi_get_state can get operation status - \param[in] spi SPI handle to operate - \param[in] data_out Pointer to buffer with data to send to SPI transmitter - \param[out] data_in Pointer to buffer for data to receive from SPI receiver - \param[in] size Data size(byte) - \return Error code -*/ -csi_error_t csi_spi_send_receive_async(csi_spi_t *spi, const void *data_out, void *data_in, uint32_t size); - -/* - \brief Set slave select num. Only valid for master - \param[in] handle SPI handle to operate - \param[in] slave_num SPI slave num - \return None - */ -void csi_spi_select_slave(csi_spi_t *spi, uint32_t slave_num); - -/** - \brief Link DMA channel to spi device - \param[in] spi SPI handle to operate - \param[in] tx_dma The DMA channel handle for send, when it is NULL means to unlink the channel - \param[in] rx_dma The DMA channel handle for receive, when it is NULL means to unlink the channel - \return Error code -*/ -csi_error_t csi_spi_link_dma(csi_spi_t *spi, csi_dma_ch_t *tx_dma, csi_dma_ch_t *rx_dma); - -/** - \brief Get the state of spi device - \param[in] spi SPI handle to operate - \param[out] state The state of spi device - \return Error code -*/ -csi_error_t csi_spi_get_state(csi_spi_t *spi, csi_state_t *state); - -/** - \brief Enable spi power manage - \param[in] spi SPI handle to operate - \return Error code -*/ -csi_error_t csi_spi_enable_pm(csi_spi_t *spi); - -/** - \brief Disable spi power manage - \param[in] spi SPI handle to operate - \return Error code -*/ -void csi_spi_disable_pm(csi_spi_t *spi); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_SPI_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/spiflash.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/spiflash.h deleted file mode 100755 index 64a24ca9..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/spiflash.h +++ /dev/null @@ -1,303 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/spiflash.h - * @brief Header File for SPIFLASH Driver - * @version V1.0 - * @date 02. June 2020 - * @model spiflash - ******************************************************************************/ -#ifndef _DRV_SPIFLASH_H_ -#define _DRV_SPIFLASH_H_ - -#include <stdint.h> -#include <drv/gpio.h> -#include <drv/spi.h> -#include <drv/qspi.h> -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** -* \brief Build a flash ID -* \param [in] vendor_id Vendor id(8bit) -* \param [in] device_id Flash device id (ID15~ID0) 16bit -* \return 24bit flash id -*/ -#define FLASH_ID_BUILD(VENDOR_ID,DEVICE_ID) - -/** -* \struct csi_spiflash_lock_info_t -* \ flash use status register 1 to protect data in memory array -* \ different flash vendor support different protect region (top/bottom/none) -* also support different protect number -* status1 register bif field show as follow -* 7 |6 |5 |4 |3 |2 |1 |0 -* --------------------------------------------------------------------- -* vensor def | vendor def | vendor def | BP2 | BP1 | BP0 | WEL | BUSY -* \ Protect type -* \ Protect block size : Vendor define ,user should check flash datasheet of vendor -* : Use w25q64fw as example , min protect block size is 128 KB -* \ TOP : Protect address from flash top address -* \ BOTTOM : Protect address from flash bottom address -* \ SEC : Protect addres base on sector unit and protect region only must not exceed one block -* \ BPx : Protect start addres base on TOP/BOTTOM feature,and BPx value denote protect number -* \ BP[x..0]'s value : 2^(n-1) protect block unit, ex, BP[x..0] = 5, protect block number = 2^(5-1) = 16 -* \ If BP[x..0] = 0 denote protect none -* \ If BP[x..0]'s all bis is 1 ,denote protect all flash -* \ -* \ NOTE: -* \ only support SEC = 0 -* \ only support CMP = 0 -* \ -* -* Sample table portion for 8MB flash (Winbond w25q64fw): -* -* SEC | TB | BP2 | BP1 | BP0 | Prot Length | Protected Portion -* -------------------------------------------------------------------------- -* X | X | 0 | 0 | 0 | NONE | NONE -* 0 | 0 | 0 | 0 | 1 | 128 KB | Upper 1/64 -* 0 | 0 | 0 | 1 | 0 | 256 KB | Upper 1/32 -* 0 | 0 | 0 | 1 | 1 | 512 KB | Upper 1/16 -* 0 | 0 | 1 | 0 | 0 | 1 MB | Upper 1/8 -* 0 | 0 | 1 | 0 | 1 | 2 MB | Upper 1/4 -* 0 | 0 | 1 | 1 | 0 | 4 MB | Upper 1/2 -* X | X | 1 | 1 | 1 | 8 MB | ALL -* ------|-------|-------|-------|-------|---------------|------------------- -* 0 | 1 | 0 | 0 | 1 | 128 KB | Lower 1/64 -* 0 | 1 | 0 | 1 | 0 | 256 KB | Lower 1/32 -* 0 | 1 | 0 | 1 | 1 | 512 KB | Lower 1/16 -* 0 | 1 | 1 | 0 | 0 | 1 MB | Lower 1/8 -* 0 | 1 | 1 | 0 | 1 | 2 MB | Lower 1/4 -* 0 | 1 | 1 | 1 | 0 | 4 MB | Lower 1/2 -* -*/ -typedef enum { - LOCK_TP_NONE, - LOCK_TP_TOP, - LOCK_TP_BOTTOM, - LOCK_TP_DUAL -} csi_spiflash_lock_region_t; -typedef enum { - SPIFLASH_DATA_1_LINE = 1, - SPIFLASH_DATA_2_LINES = 2, - SPIFLASH_DATA_4_LINES = 4 -} csi_spiflash_data_line_t; -typedef union { - csi_spi_t spi; - csi_qspi_t qspi; -} csi_spi_qspi_t; - -/** -\brief Flash information -*/ -typedef struct { - char *flash_name; ///< Name string of spiflash - uint32_t flash_id; ///< JEDEC ID = manufature ID <<16 | device ID (ID15~ID0) - uint32_t flash_size; ///< Flash chip size - uint32_t xip_addr; ///< If use qspi controler to access flash ,code can be ececuted on flash ,the addr is xip addr - uint32_t sector_size; ///< Sector size - uint32_t page_size; ///< Page size for read or program -} csi_spiflash_info_t; - -typedef struct{ - struct{ - uint8_t buswidth; ///< cmd buswidth - }cmd; - struct { - uint8_t buswidth; ///< addr buswidth - }addr; - struct { - uint8_t nbytes; ///< dummy bytes - }dummy; - struct { - uint8_t buswidth; ///< data buswidth - }data; -} csi_spiflash_cmd_t; - -/** -\brief Flash control block -*/ -typedef struct { - csi_spi_qspi_t spi_qspi; ///< Spi/qspi handle - void (*spi_cs_callback)(csi_gpio_pin_state_t value); - void *flash_prv_info; ///< Point to vendor private feature struct - int32_t (*spi_send)(void *spi, uint8_t cmd, uint32_t addr, uint32_t addr_size, const void *data, uint32_t size); - int32_t (*spi_receive)(void *spi, uint8_t cmd, uint32_t addr, uint32_t addr_size, void *data, uint32_t size); - csi_error_t (*set_cmd)(void *spi, csi_spiflash_cmd_t *cmd); - void *priv; ///< User private param -} csi_spiflash_t; - -/** - \brief Initialize SPIFLASH with spi controler and probe flash device - \param[in] spiflash SPIFLASH handle - \param[in] spi_idx SPI controler index - \param[in] spi_cs GPIO info for chip select,if NULL, not use gpio cs - \return Error code -*/ -csi_error_t csi_spiflash_spi_init(csi_spiflash_t *spiflash, uint32_t spi_idx, void *spi_cs_callback); - -/** - \brief Initialize SPIFLASH with qspi controler and probe flash device - \param[in] spiflash SPIFLASH handle - \param[in] qspi_idx QSPI controler index - \return Error code -*/ -csi_error_t csi_spiflash_qspi_init(csi_spiflash_t *spiflash, uint32_t qspi_idx, void *qspi_cs_callback); - -/** - \brief De-initialize SPIFLASH Interface based on spi controler. stops operation and releases the software resources used by the interface - \param[in] spiflash SPIFLASH handle to operate - \return Error code -*/ -void csi_spiflash_spi_uninit(csi_spiflash_t *spiflash); - -/** - \brief De-initialize SPIFLASH Interface based on qspi controler. stops operation and releases the software resources used by the interface - \param[in] spiflash SPIFLASH handle to operate - \return Error code -*/ -void csi_spiflash_qspi_uninit(csi_spiflash_t *spiflash); - - -/** - \brief Get flash device infomation - \param[in] spiflash SPIFLASH handle to operate - \param[in] flash_info User storage to get flash vendor info after flash init - \return spiflash_info_t -*/ -csi_error_t csi_spiflash_get_flash_info(csi_spiflash_t *spiflash, csi_spiflash_info_t *flash_info); - - -/** - \brief Read data from Flash - \param[in] spiflash SPIFLASH handle to operate - \param[in] offset Data address, offset address relative to zero - \param[out] data Pointer to a buffer storing the data read from Flash - \param[in] size Number of data items to read - \return If receive successful, this function shall return the num of data witch is received successful - otherwise, the function shall return Error code -*/ -int32_t csi_spiflash_read(csi_spiflash_t *spiflash, uint32_t offset, void *data, uint32_t size); - -/** - \brief Program data to Flash - \param[in] spiflash SPIFLASH handle to operate - \param[in] offset Data address, offset address relative to zero - \param[in] data Pointer to a buffer containing the data to be programmed to Flash. - \param[in] size Number of data items to program - \return If program successful, this function shall return the num of data witch is program successful, - otherwise, the function shall return Error code -*/ -int32_t csi_spiflash_program(csi_spiflash_t *spiflash, uint32_t offset, const void *data, uint32_t size); - -/** - \brief Erase Flash Sector - \param[in] spiflash SPIFLASH handle to operate - \param[in] offset Data address, offset address relative to zero - \param[in] size Length to be erased - \return Error code -*/ -csi_error_t csi_spiflash_erase(csi_spiflash_t *spiflash, uint32_t offset, uint32_t size); - -/** - \brief Read flash status register - \param[in] spiflash SPIFLASH handle to operate - \param[in] cmd_code Cmd code - \param[out] data Data buf to save flash status register - \param[in] size Register length in byte - \return Error code -*/ -csi_error_t csi_spiflash_read_reg(csi_spiflash_t *spiflash, uint8_t cmd_code, uint8_t *data, uint32_t size); - -/** - \brief Write status register - \param[in] spiflash SPIFLASH handle to operate - \param[in] cmd Cmd code - \param[out] data Data buf to save flash status register - \param[in] size Register length in byte - \return Error code -*/ -csi_error_t csi_spiflash_write_reg(csi_spiflash_t *spiflash, uint8_t cmd_code, uint8_t *data, uint32_t size); - - -/** - \brief Enable spiflash write protection - \param[in] spiflash SPIFLASH handle to operate - \param[in] offset Protect flash offset,offset need protect block size aligned - \param[in] size Lock size(byte) - \return Error code -*/ -csi_error_t csi_spiflash_lock(csi_spiflash_t *spiflash, uint32_t offset, uint32_t size); - -/** - \brief Enable spiflash write protection - \param[in] spiflash SPIFLASH handle to operate - \param[in] offset Protect flash offset,offset need protect block size aligned - \param[in] size Unlock size(byte) - \return Error code -*/ -csi_error_t csi_spiflash_unlock(csi_spiflash_t *spiflash, uint32_t offset, uint32_t size); - -/** - \brief check flash is locked(write protect) - \param[in] spiflash SPIFLASH handle to operate - \param[in] offset Protect flash offset,offset need protect block size aligned - \param[in] size Locked size(byte) - \return 0:unlocked if query region overlay with locked region 1: locked if query reigon is fully in locked region -*/ -int csi_spiflash_is_locked(csi_spiflash_t *spiflash, uint32_t offset, uint32_t size); - -/** - \brief Set QSPI data line - \param[in] spiflash SPIFLASH handle to operate - \param[in] line SPIFLASH data line mode - \return Error code -*/ -csi_error_t csi_spiflash_config_data_line(csi_spiflash_t *spiflash, csi_spiflash_data_line_t line); - -/** - \brief Set QSPI frequence - \param[in] spiflash SPIFLASH handle to operate - \param[in] hz SPIFLASH frequence - \return The actual config frequency -*/ -uint32_t csi_spiflash_frequence(csi_spiflash_t *spiflash, uint32_t hz); - -/** - \brief Flash power down. - \param[in] spiflash SPIFLASH handle to operate. - \return error code -*/ -csi_error_t csi_spiflash_release_power_down(csi_spiflash_t *spiflash); - -/** - \brief Flash power release. - \param[in] spiflash SPIFLASH handle to operate. - \return none -*/ -void csi_spiflash_power_down(csi_spiflash_t *spiflash); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_SPIFLASH_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/spinand.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/spinand.h deleted file mode 100644 index 8a011987..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/spinand.h +++ /dev/null @@ -1,321 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file spinand.h - * @brief header file for spinand driver - * @version V1.0 - * @date 17. Aug 2017 - * @model spinand - ******************************************************************************/ -#ifndef _DRV_NANDFLASH_H_ -#define _DRV_NANDFLASH_H_ - - -#include <stdint.h> -#include <drv/gpio.h> -#include <drv/qspi.h> -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define SPINAND_DEF_SPEED (1000000) -#define SPIANND_DEF_MAX_WAIT_TIME (1000) ///< max wait time in ms - -typedef union { - csi_qspi_t qspi; ///< hold qspi object -} csi_nand_spi_qspi_t; - - -typedef struct { -uint32_t target; ///< target in chip -uint32_t lun; ///< lun in target -uint32_t plane; ///< plane number in lun -uint32_t block; ///< block index in lun -uint32_t page; ///< page index in lun -uint32_t offset; ///< column offset within page -}csi_nand_pos_t; - -typedef enum{ - SPI_MEM_NODATA, ///< no data portion - SPI_MEM_DATA_IN, ///< read data - SPI_MEM_DATA_OUT ///< write data -}csi_spi_mem_dir_t; - -typedef struct{ - - struct{ - uint8_t buswidth; ///< cmd buswidth - uint8_t opcode; ///< cmd code - }cmd; - - struct { - uint8_t buswidth; ///< addr buswidth - uint8_t nbytes; ///< bytes of addr - uint64_t val; ///< addr value - }addr; - - struct { - uint8_t nbytes; ///< dummy bytes - uint8_t buswidth; ///< bus width - }dummy; - - - struct { - uint8_t buswidth; ///< data buswidth - uint32_t nbytes; ///< data len - csi_spi_mem_dir_t dir; ///< data xfer dir - union{ - void* in; ///< read data buf ptr - void* out; ///< write datat buf ptr - }buf; - }data; - -}spi_mem_op_t; - -typedef struct { - const uint8_t *id; ///< point to chip id array - const uint8_t len; ///< id length -}csi_spinand_id_t; - -typedef struct { - uint8_t id[4]; ///< id data - uint8_t len; ///< id length -}csi_nand_id_t; - - -typedef struct{ - uint16_t strength; ///< number of hw-ecc engine bits - uint16_t step_size; ///< corect size by ecc per-step -}csi_nand_ecc_req_t; - -typedef struct { - uint32_t bits_per_cell; ///< bit per-cell - uint32_t pagesize; ///< page size - uint32_t oobsize; ///< spare area size - uint32_t pages_per_eraseblock; ///< pages per block - uint32_t eraseblocks_per_lun; ///< blocks per lun(logic unit number== max block index ) - uint32_t max_bad_eraseblocks_per_lun; ///< max bad blocks per lun - uint32_t planes_per_lun; ///< planes per-lun - uint32_t luns_per_target; ///< luns per die - uint32_t ntargets; ///< target index -}csi_nand_mem_layout_t; - - - -typedef struct { - char *model; ///< chip name of vendor - uint32_t flags; ///< chip-specific feature bits group - csi_spinand_id_t devid; ///< devid of chip - csi_nand_mem_layout_t memorg; ///< mem layout of chip - csi_nand_ecc_req_t eccreq; ///< ecc capabilty of chip - csi_error_t (*select_target)(void *spinand, uint32_t target); ///< select target - csi_error_t (*check_ecc_status)(void *spinand,uint8_t status); ///< check vendor specific ecc status -}csi_spinand_info_t; - - -typedef struct { - csi_error_t (*init) (void *spinand); ///< vendor chip inition - void (*uninit) (void *spinand); ///< vendor chip uninition -}csi_spinand_manufacturer_ops_t; - -typedef struct { - uint8_t id; ///< vendor id - char *name; ///< vendor name - const csi_spinand_info_t *chips; ///< vendor chip param - uint32_t nchips; ///< chips number supported - const csi_spinand_manufacturer_ops_t *ops; ///< vendor specific operations -}csi_spinand_manufacturer_t; - - -typedef struct { - char *model_name; ///< name of nand-device module - uint16_t page_size; ///< page-size of nand-device - uint16_t oob_size; ///< oob-size(spare size) of nand-device - uint16_t pages_per_block; ///< pages-per-block - uint16_t max_bad_blocks; ///< max possible bad blocks of nand-device - uint32_t total_blocks; ///< total blocks of nand-device -}csi_spinand_dev_params_t; - -typedef struct -{ - void *xfer_buf; ///< point to xfer data buf - uint32_t xfer_buf_len; ///< length of xfer buf ,count in byte - uint16_t rxfer_copy_offset; ///< copy offset from word-aligned buf - uint16_t rxfer_origin_len; ///< copy length from word-aligned buf -}csi_xfer_data_buf_t; - - -/** -\brief Flash control block -*/ -typedef struct { - #define SPINAND_SCRAT_BUF_LEN 4 ///< scratch buf len - csi_nand_spi_qspi_t spi_qspi; ///< Spi/qspi handle - uint8_t scractbuf[SPINAND_SCRAT_BUF_LEN]; ///< scracthbuf for read/write id or reg - uint8_t cur_target; ///< current target - uint16_t max_tx_size; ///< max tx op size - uint16_t max_rx_size; ///< max rx op size - csi_xfer_data_buf_t xfer; ///< xfer buf - csi_spinand_info_t *chip_info; ///< Point to vendor private feature struct - csi_spinand_manufacturer_t *maf; ///< point to manufacture - void (*spi_cs_callback)(csi_gpio_pin_state_t value); ///< gpio chip select for spi or qspi - csi_error_t (*spi_mem)(void *spinand,spi_mem_op_t *op); ///< spi-mem op function - void *priv; ///< User private param -} csi_spinand_t; - -typedef enum { - XFER_CPU_POLLING, ///< transfer by qspi with cpu polling mode - XFER_DMA, ///< transfer by qspi with external dma engine - XFER_INTR, ///< transfer by qspi with cpu-interrut -}csi_spinand_xfer_t; - -/** - \brief Initialize NANDFLASH with qspi controler and probe flash device - \param[in] spinand NANDFLASH handle - \param[in] qspi_idx QSPI controler index - \param[in] spi_cs_callback GPIO info for chip select,if NULL, not use gpio cs - \return Error code -*/ -csi_error_t csi_spinand_qspi_init(csi_spinand_t *spinand, uint32_t qspi_idx,void *gpio_cs_callback); - -/** - \brief De-initialize NANDFLASH Interface based on spi controler. stops operation and releases the software resources used by the interface - \param[in] spinand NANDFLASH handle to operate - \return Error code -*/ -void csi_spinand_qspi_uninit(csi_spinand_t *spinand); - -/** - \brief set xfer mode - \param[in] spinand NANDFLASH handle to operate - \param[in] xfer_mode please ref csi_spinand_xfer_t - \return Error code -*/ -csi_error_t csi_spinand_set_xfer_mode(csi_spinand_t *spinand,csi_spinand_xfer_t xfer_mode); - - -/** - \brief get flash device infomation - \param[in] spinand NANDFLASH handle to operate - \param[in] flash_info User storage to get flash vendor info after flash init - \return spinand_info_t -*/ - -csi_error_t csi_spinand_get_flash_info(csi_spinand_t *spinand, csi_spinand_dev_params_t *flash_info); - -/** - \brief Read data from Flash - \param[in] spinand NANDFLASH handle to operate - \param[in] offset Data address, offset address relative to zero - \param[out] data Pointer to a buffer storing the data read from Flash - \param[in] cnt Number of data items to read - \return If receive successful, this function shall return the num of data witch is received successfulful - otherwise, the function shall return Error code -*/ -int32_t csi_spinand_read(csi_spinand_t *spinand, uint64_t offset, void *data, uint32_t size); - - -/** - \brief Read spare data from specific page - \param[in] spinand NANDFLASH handle to operate - \param[in] page_addr page addr, address relative to zero, addr need page size aligned - \param[in] spare_offset offset address within the spare area of the page - \param[out] data Pointer to a buffer storing the data read from Flash - \param[in] size Number of data items to read - \return If receive successful, this function shall return the num of data witch is received successfully - otherwise, the function shall return Error code -*/ -int32_t csi_spinand_read_spare_data(csi_spinand_t *spinand,uint64_t page_addr,uint32_t spare_offset,void *data, uint32_t size); - -/** - \brief write data to Flash - \param[in] spinand NANDFLASH handle to operate - \param[in] offset Data address, offset address relative to zero - \param[in] data Pointer to a buffer containing the data to be programmed to Flash. - \param[in] size Number of data items to program - \return If program successful, this function shall return the num of data witch is programed successfully - otherwise, the function shall return Error code -*/ -int32_t csi_spinand_write(csi_spinand_t *spinand, uint64_t offset, const void *data, uint64_t size); - -/** - \brief write spare data to specific page - \param[in] spinand NANDFLASH handle to operate - \param[in] page_addr page addr, address relative to zero, addr need page size aligned - \param[in] spare_offset offset address within the spare area of the page - \param[out] data Pointer to a buffer storing the data write to Flash - \param[in] size Number of data items to write - \return If program successful, this function shall return the num of data witch is programed successfully - otherwise, the function shall return Error code -*/ -int32_t csi_spinand_write_spare_data(csi_spinand_t *spinand,uint64_t page_addr,uint32_t spare_offset,void *data, uint32_t size); - - -/** - \brief Erase Flash Sector - \param[in] spinand NANDFLASH handle to operate - \param[in] offset Data address, offset address relative to zero - \param[in] size Length to be erased - \param[out] last erased block addr - \return Error code -*/ -csi_error_t csi_spinand_erase(csi_spinand_t *spinand, uint64_t offset, uint64_t size, uint64_t *last_fail_addr); - -/** - \brief check whether the block is bad - \param[in] spinand NANDFLASH handle to operate - \param[in] block_addr block addr (count in bytes) - \return 1: bad 0: not bad <0 err code -*/ - - -int32_t csi_spinand_block_is_bad(csi_spinand_t *spinand,uint64_t block_addr); - -/** - \brief mark block as a bad block - \param[in] spinand NANDFLASH handle to operate - \param[in] block_addr block addr (count in bytes) - \return Error code -*/ -csi_error_t csi_spinand_block_mark_bad(csi_spinand_t *spinand, uint64_t block_addr); - -/** - \brief reset spinand device - \param[in] spinand NANDFLASH handle to operate - \return Error code -*/ -int32_t csi_spinand_reset(csi_spinand_t *spinand); - -/** - \brief Set QSPI frequence - \param[in] spinand NANDFLASH handle to operate - \param[in] hz NANDFLASH frequence - \return The actual config frequency -*/ -uint32_t csi_spinand_frequence(csi_spinand_t *spinand, uint32_t hz); - - - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_NANDFLASH_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/tee.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/tee.h deleted file mode 100755 index dc85c7b9..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/tee.h +++ /dev/null @@ -1,643 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/****************************************************************************** - * @file drv/tee.h - * @brief Header File for TEE Driver - * @version V1.0 - * @date 12 Sep 2020 - * @model tee - ******************************************************************************/ -#ifndef _DRV_TEE_H_ -#define _DRV_TEE_H_ - -#include <stdint.h> - -#ifdef __cplusplus -extern "C" { -#endif -/****** TEE AES mode *****/ -typedef enum { - TEE_AES_MODE_ECB = 0, ///< TEE AES ECB mode - TEE_AES_MODE_CBC = 1, ///< TEE AES CBC mode - TEE_AES_MODE_MAX, ///< invaild mode -} -tee_aes_mode_e; - -/** - \brief TEE AES encrypt - \note Length should be a multiple of the block size (16 bytes) - After calling this function, the content of iv is updated. - \param[in] in Pointer to plaintext buffer - \param[in] in_len Plaintext buffer length - \param[in] key Pointer to secret key - \param[in] key_len Secret key size,must be 16 bytes for AES128,24 bytes for AES192 or 32byes for AES256 - \param[out] out Pointer to ciphertext buffer - \param[in] mode \ref tee_aes_mode_e - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_aes_encrypt(const uint8_t *in, uint32_t in_len, - const uint8_t *key, uint32_t key_len, - uint8_t iv[16], - uint8_t *out, - tee_aes_mode_e mode); - -/** - \brief TEE AES decrypt - \note Length should be a multiple of the block size (16 bytes) - After calling this function, the content of iv is updated. - \param[in] in Pointer to ciphertext buffer - \param[in] in_len Ciphertext buffer length - \param[in] key Pointer to secret key - \param[in] key_len Secret key size,must be 16 bytes for AES128,24 bytes for AES192 or 32byes for AES256 - \param[out] out Pointer to plaintext buffer - \param[in] mode \ref tee_aes_mode_e - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_aes_decrypt(const uint8_t *in, uint32_t in_len, - const uint8_t *key, uint32_t key_len, - uint8_t iv[16], - uint8_t *out, - uint32_t mode); - -/** - \brief TEE AES ECB encrypt - \note Length should be a multiple of the block size (16 bytes) - After calling this function, the content of iv is updated. - \param[in] in Pointer to plaintext buffer - \param[in] in_len Plaintext buffer length - \param[in] key Pointer to secret key - \param[in] key_len Secret key size,must be 16 bytes for AES128,24 bytes for AES192 or 32byes for AES256 - \param[out] out Pointer to ciphertext buffer - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_aes_encrypt_ecb(in, in_len, key, key_len, out) \ - csi_tee_aes_encrypt(in, in_len, key, key_len, NULL, out, TEE_AES_MODE_ECB) - -/** - \brief TEE AES ECB decrypt - \note Length should be a multiple of the block size (16 bytes) - After calling this function, the content of iv is updated. - \param[in] in Pointer to ciphertext buffer - \param[in] in_len Ciphertext buffer length - \param[in] key Pointer to secret key - \param[in] key_len Secret key size,must be 16 bytes for AES128,24 bytes for AES192 or 32byes for AES256 - \param[out] out Pointer to plaintext buffer - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_aes_decrypt_ecb(in, in_len, key, key_len, out) \ - csi_tee_aes_decrypt(in, in_len, key, key_len, NULL, out, TEE_AES_MODE_ECB) - -/** - \brief TEE AES CBC encrypt - \note Length should be a multiple of the block size (16 bytes) - After calling this function, the content of iv is updated. - \param[in] in Pointer to ciphertext buffer - \param[in] in_len Ciphertext buffer length - \param[in] key Pointer to secret key - \param[in] key_len Secret key size,must be 16 bytes for AES128,24 bytes for AES192 or 32byes for AES256 - \param[out] out Pointer to plaintext buffer - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_aes_encrypt_cbc(in, in_len, key, key_len, iv, out) \ - csi_tee_aes_encrypt(in, in_len, key, key_len, iv, out, TEE_AES_MODE_CBC) - -/** - \brief TEE AES CBC decrypt - \note Length should be a multiple of the block size (16 bytes) - After calling this function, the content of iv is updated. - \param[in] in Pointer to ciphertext buffer - \param[in] in_len Ciphertext buffer length - \param[in] key Pointer to secret key - \param[in] key_len Secret key size,must be 16 bytes for AES128,24 bytes for AES192 or 32byes for AES256 - \param[out] out Pointer to plaintext buffer - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_aes_decrypt_cbc(in, in_len, key, key_len, iv, out) \ - csi_tee_aes_decrypt(in, in_len, key, key_len, iv, out, TEE_AES_MODE_CBC) - -/** - \brief TEE BASE64 encode/decode - \param[in] in Pointer to input data buffer - \param[in] in_len Input data buffer length - \param[out] out Pointer to output data buffer - \param[out] out_len Output data buffer length - \param[in] is_encode 1 encode 0 decode - \param[in] wsafe Base64 websafe feature,set 1, replace "+/" with "-_" - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_base64(const uint8_t *in, uint32_t in_len, - uint8_t *out, uint32_t *out_len, - uint32_t is_encode, - uint32_t wsafe); - -/** - \brief TEE BASE64 encode - \param[in] in Pointer to input data buffer - \param[in] in_len Input data buffer length - \param[out] out Pointer to output data buffer - \param[out] out_len Output data buffer length - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_base64_encode(in,in_len,out,out_len) \ - csi_tee_base64(in,in_len,out,out_len,1,0) - -/** - \brief TEE BASE64 decode - \param[in] in Pointer to input data buffer - \param[in] in_len Input data buffer length - \param[out] out Pointer to output data buffer - \param[out] out_len Output data buffer length - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_base64_decode(in,in_len,out,out_len) \ - csi_tee_base64(in,in_len,out,out_len,0,0) - -/** - \brief TEE BASE64 web safe encode - \param[in] in Pointer to input data buffer - \param[in] in_len Input data buffer length - \param[out] out Pointer to output data buffer - \param[out] out_len Output data buffer length - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_base64_websafe_encode(in,in_len,out,out_len) \ - csi_tee_base64(in,in_len,out,out_len,1,1) - -/** - \brief TEE BASE64 web safe decode - \param[in] in Pointer to input data buffer - \param[in] in_len Input data buffer length - \param[out] out Pointer to output data buffer - \param[out] out_len Output data buffer length - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_base64_websafe_decode(in,in_len,out,out_len) \ - csi_tee_base64(in,in_len,out,out_len,0,1) - -/** - \brief TEE obtain CID from Key Provisioning - \param[out] out Pointer to cid buffer - \param[out] out_len CID buffer length,if cid obtain successfully, - out_len is updated to actual cid sizes - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_get_cid(uint8_t *out, uint32_t *out_len); - -/****** lpm mode *****/ -typedef enum { - TEE_LPM_MODE_WAIT = 0, ///< lpm wait - TEE_LPM_MODE_DOZE = 1, ///< lpm doze - TEE_LPM_MODE_STOP = 2, ///< lpm stop - TEE_LPM_MODE_STANDBY = 3, ///< lpm standby - TEE_LPM_MODE_CLOCK = 4, ///< lpm clock gate - TEE_LPM_MODE_MAX, -} tee_lpm_mode_e; - -/** - \brief TEE set low power mode - \param[in] gate Not use for now - \param[in] irqid Not use for now - \param[in] mode \ref tee_lpm_mode_e - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_enter_lpm(uint32_t gate, uint32_t irqid, tee_lpm_mode_e mode); - -/** - \brief TEE obtain manifest info from manifest table - \note call csi_tee_get_sys_img_info, csi_tee_get_sys_os_version or csi_tee_get_sys_partition is better - \param[out] out Pointer to info buffer - \param[out] out_len Info buffer length,if info obtain successfully, - out_len is updated to actual sizes - \param[in] name info name - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_get_manifest_info(uint8_t *out, uint32_t *out_len, char *name); - -/** - \brief TEE obtain image buffer from manifest table - \param[out] out Pointer to image buffer - \param[out] out_len Image buffer length,if info obtain successfully, - out_len is updated to actual image buffer sizes - \param[in] img_name Image name - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_get_sys_img_info(out,out_len,img_name) \ - csi_tee_get_manifest_info(out,out_len,img_name) - -/** - \brief TEE obtain os version from manifest table - \param[out] out Pointer to os version buffer - \param[out] out_len OS version buffer length,if info obtain successfully, - out_len is updated to actual os version buffer sizes - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_get_sys_os_version(out,out_len) \ - csi_tee_get_manifest_info(out,out_len,"os_v") - -/** - \brief TEE obtain partition buffer from manifest table - \param[out] out Pointer to partition buffer - \param[out] out_len Partition buffer length,if info obtain successfully, - out_len is updated to actual partition buffer sizes - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_get_sys_partition(out,out_len) \ - csi_tee_get_manifest_info(out,out_len,"sys_p") - -/** - \brief TEE set random seed - \param[in] Seed random sedd - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_rand_seed(uint32_t seed); - -/** - \brief TEE ramdom date generation - \param[out] out Pointer to random data buffer - \param[in] out_len Data buffer length - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_rand_generate(uint8_t *out, uint32_t out_len); - -/****** TEE RSA sign type *****/ -typedef enum { - TEE_RSA_MD5 = 0, ///< MD5 - TEE_RSA_SHA1 = 1, ///< SHA1 - TEE_RSA_SHA256 = 3, ///< SHA256 - TEE_RSA_SIGN_TYPE_MAX, ///< invailed type -} tee_rsa_sign_type_e; - -/** - \brief TEE RSA sign with private key - \param[in] in Pointer to digest buffer - \param[in] in_len Digest buffer length - \param[in] key Pointer to private key,key contains n, e, d - \param[in] key_len Private key size,must be 128*3 = 384 bytes for RSA1024, 256*3 = 768 bytes for RSA2048 - \param[out] sign Pointer to sign buffer - \param[out] sign_len Sign buffer length - \param[in] type \ref tee_rsa_sign_type_e - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_rsa_sign(const uint8_t *in, uint32_t in_len, - const uint8_t *key, uint32_t key_len, - uint8_t *sign, uint32_t *sign_len, - tee_rsa_sign_type_e type); - -/** - \brief TEE RSA verify with public key - \param[in] in Pointer to digest buffer - \param[in] in_len Digest buffer length - \param[in] key Pointer to public key,key contains n, e - \param[in] key_len Public key size,must be 128*2 = 256 bytes for RSA1024, 256*2 = 512 bytes for RSA2048 - \param[in] sign Pointer to sign buffer - \param[in] sign_len Sign buffer length - \param[in] type \ref tee_rsa_sign_type_e - \return Return 0 if verify successful,otherwise error code -*/ -int32_t csi_tee_rsa_verify(const uint8_t *in, uint32_t in_len, - const uint8_t *key, uint32_t key_len, - uint8_t *sign, uint32_t sign_len, - tee_rsa_sign_type_e type); - -/****** TEE RSA padding mode *****/ -typedef enum { - TEE_RSA_PKCS1_PADDING = 0x01, ///< RSA PKCS padding mode - TEE_RSA_NO_PADDING = 0x02, ///< RSA no padding mode -} tee_rsa_padding_mode_e; - -/** - \brief TEE RSA encrypt with public key - \param[in] in Pointer to plaintext buffer - \param[in] in_len Plaintext buffer length - \param[in] key Pointer to public key,key contains n, e - \param[in] key_len Public key size, must be 128*2 = 256 bytes for RSA1024, 256*2 = 512 bytes for RSA2048 - \param[in] out Pointer to ciphertext buffer - \param[in] out_len Ciphertext buffer length - \param[in] padding \ref tee_rsa_padding_mode_e - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_rsa_encrypt(const uint8_t *in, uint32_t in_len, - const uint8_t *key, uint32_t key_len, - uint8_t *out, uint32_t *out_len, - tee_rsa_padding_mode_e padding); -/** - \brief TEE RSA decrypt with private key - \param[in] in Pointer to ciphertext buffer - \param[in] in_len Ciphertext buffer length - \param[in] key Pointer to private key,key contains n, e, d - \param[in] key_len Private key size,must be 128*3 = 384 bytes for RSA1024, 256*3 = 768 bytes for RSA2048 - \param[in] out Pointer to plaintext buffer - \param[in] out_len Plaintext buffer length - \param[in] padding \ref tee_rsa_padding_mode_e - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_rsa_decrypt(const uint8_t *in, uint32_t in_len, - const uint8_t *key, uint32_t key_len, - uint8_t *out, uint32_t *out_len, - tee_rsa_padding_mode_e padding); - -/** - \brief TEE RSA sign with internal private key - \note Only use if key provisioning exist - \param[in] in Pointer to digest buffer - \param[in] in_len Digest buffer length - \param[out] sign Pointer to sign buffer - \param[out] sign_len Sign buffer length - \param[in] type \ref tee_rsa_sign_type_e - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_cid_rsa_sign(in,in_len,sign,sign_len,type) \ - csi_tee_rsa_sign(in,in_len,NULL,0,sign,sign_len,type) - -/** - \brief TEE RSA verify with internal public key - \note Only use if key provisioning exist - \param[in] in Pointer to digest buffer - \param[in] in_len Digest buffer length - \param[in] sign Pointer to sign buffer - \param[in] sign_len Sign buffer length - \param[in] type \ref tee_rsa_sign_type_e - \return Return 0 if verify successful,otherwise error code -*/ -#define csi_tee_cid_rsa_verify(in,in_len,sign,sign_len,type) \ - csi_tee_rsa_verify(in,in_len,NULL,0,sign,sign_len,type) - -/** - \brief TEE RSA encrypt with internal public key - \note Only use if key provisioning exist - \param[in] in Pointer to plaintext buffer - \param[in] in_len Plaintext buffer length - \param[in] out Pointer to ciphertext buffer - \param[in] out_len Ciphertext buffer length - \param[in] padding \ref tee_rsa_padding_mode_e - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_cid_rsa_encrypt(in,in_len,out,out_len,padding) \ - csi_tee_rsa_encrypt(in,in_len,NULL,0,out,out_len,padding) - -/** - \brief TEE RSA decrypt with internal private key - \note Only use if key provisioning exist - \param[in] in Pointer to ciphertext buffer - \param[in] in_len Ciphertext buffer length - \param[in] key Pointer to private key,key contains n, e, d - \param[in] key_len Private key size,must be 128*3 = 384 bytes for RSA1024, 256*3 = 768 bytes for RSA2048 - \param[in] out Pointer to plaintext buffer - \param[in] out_len Plaintext buffer length - \param[in] padding \ref tee_rsa_padding_mode_e - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_cid_rsa_decrypt(in,in_len,out,out_len,padding) \ - csi_tee_rsa_decrypt(in,in_len,NULL,0,out,out_len,padding) - -/** - \brief verify boot image with boot public key - \note Only use if key provisioning exist - \param[in] in Pointer to digest buffer - \param[in] in_len Digest buffer length - \param[in] sign Pointer to sign buffer - \param[in] sign_len Sign buffer length - \param[in] type \ref tee_rsa_sign_type_e - \return Return 0 if verify successful,otherwise error code -*/ -int32_t csi_tee_img_rsa_verify(const uint8_t *in, uint32_t in_len, - uint8_t *sign, uint32_t sign_len, - tee_rsa_sign_type_e type); - -/****** TEE HASH operation mode *****/ -typedef enum { - TEE_HASH_OP_NONE = 0, ///< No operation - TEE_HASH_OP_START = 1, ///< HASH init - TEE_HASH_OP_UPDATA = 2, ///< HASH update - TEE_HASH_OP_FINISH = 3, ///< HASH finish - TEE_HASH_OP_MAX, ///< invailed operation -} tee_hash_op_e; - -/****** TEE HMAC type *****/ -typedef enum { - TEE_HMAC_SHA1 = 1, ///< HMAC with SHA1 -} tee_hmac_type_e; - -/** - \brief TEE HAMC - \note Call csi_tee_hmac_digest is better - out buffer size must be large enough according to type, eg. 20 bytes for TEE_HMAC_SHA1 - \param[in] in Pointer to input data buffer - \param[in] in_len Input data buffer length - \param[in] key Pointer to key buffer - \param[in] key_len Key buffer size - \param[out] out Pointer to output date buffer - \param[in] type \ref tee_hmac_type_e - \param[in] hash_op \ref tee_hash_op_e - \param[in] ctx Pointer to context of hmac - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_hmac(const uint8_t *in, uint32_t in_len, - const uint8_t *key, uint32_t key_len, - uint8_t *out, - tee_hmac_type_e type, - tee_hash_op_e hash_op, - uint32_t *ctx); - -/** - \brief TEE HAMC digest - \note out buffer size must be large enough according to type, eg. 20 bytes for TEE_HMAC_SHA1 - \param[in] in Pointer to input data buffer - \param[in] in_len Input data buffer length - \param[in] key Pointer to key buffer - \param[in] key_len Key buffer size - \param[out] out Pointer to output date buffer - \param[in] type \ref tee_hmac_type_e - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_hmac_digest(in,in_len,key,key_len,out,type) \ - csi_tee_hmac(in,in_len,key,key_len,out,type,TEE_HASH_OP_NONE,NULL) - -/****** TEE SHA type *****/ -typedef enum { - TEE_SHA1 = 0, ///< SHA1 - TEE_SHA256 = 1, ///< SHA256 - TEE_SHA224 = 2, ///< SHA224 - TEE_SHA384 = 3, ///< SHA384 - TEE_SHA512 = 4, ///< SHA512 - TEE_SHA_MAX, ///< invaild sha type -} tee_sha_type_t; - -/** - \brief TEE SHA - \note Call csi_tee_sha_digest, csi_tee_sha_start, csi_tee_sha_update or csi_tee_sha_finish is better - out buffer size must be large enough according to type, eg. 20 bytes for TEE_SHA1, 32 bytes for TEE_SHA256 - \param[in] in Pointer to input data buffer - \param[in] in_len Input data buffer length - \param[out] out Pointer to output date buffer - \param[in] type \ref tee_sha_type_t - \param[in] hash_op \ref tee_hash_op_e - \param[in] ctx Pointer to context of sha - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_sha(const uint8_t *in, uint32_t in_len, - uint8_t *out, - tee_sha_type_t type, - tee_hash_op_e hash_op, - void *ctx); - -/** - \brief TEE SHA digest - \note out buffer size must be large enough according to type, eg. 20 bytes for TEE_SHA1, 32 bytes for TEE_SHA256 - \param[in] in Pointer to input data buffer - \param[in] in_len Input data buffer length - \param[out] out Pointer to output date buffer - \param[in] type \ref tee_sha_type_t - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_sha_digest(in,in_len,out,type) \ - csi_tee_sha(in,in_len,out,type,TEE_HASH_OP_NONE,NULL); - -/** - \brief TEE SHA start, initial sha - \param[in] type \ref tee_sha_type_t - \param[in] ctx Pointer to context of sha - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_sha_start(type,ctx) \ - csi_tee_sha(NULL,0,NULL,type,TEE_HASH_OP_START,ctx); - -/** - \brief TEE SHA update, update data - \param[in] in Pointer to input data buffer - \param[in] in_len Input data buffer length - \param[in] ctx Pointer to context of sha - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_sha_update(in,in_len,ctx) \ - csi_tee_sha(in,in_len,NULL,0,TEE_HASH_OP_UPDATA,ctx); - -/** - \brief TEE SHA digest, get sha digest - \note out buffer size must be large enough according to type, eg. 20 bytes for TEE_SHA1, 32 bytes for TEE_SHA256 - \param[out] out Pointer to output date buffer - \param[in] ctx Pointer to context of sha - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_sha_finish(out,ctx) \ - csi_tee_sha(NULL,0,out,0,TEE_HASH_OP_FINISH,ctx); - -/** - \brief TEE get device name and product key - \param[in] name_encrypted Pointer to device name ciphertext - \param[in] name_encrypted_len device name ciphertext length - \param[in] product_key_encrypted Pointer to device product key ciphertext - \param[in] product_key_encrypted_len Device product key ciphertext length - \param[out] name Pointer to device name - \param[out] name_len Device name length - \param[out] product_key Pointer to device product key - \param[out] product_key_len Device product key length - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_dev_info_get(const uint8_t *name_encrypted, uint32_t name_encrypted_len, - const uint8_t *product_key_encrypted, uint32_t product_key_encrypted_len, - const uint8_t *name, uint32_t *name_len, - const uint8_t *product_key, uint32_t *product_key_len); - -/** - \brief TEE device info sign - \param[in] in Pointer to input date buffer - \param[in] in_len Input data buffer length - \param[in] device_secret Pointer to device secret ciphertext - \param[in] device_secret_len Device secret ciphertext length - \param[out] sign Pointer to signed buffer - \param[out] sign_len Signed buffer length - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_dev_info_sign(const uint8_t *in, uint32_t in_len, - const uint8_t *device_secret, uint32_t device_secret_len, - const uint8_t *sign, uint32_t *sign_len); - -/** - \brief TEE device info encrypt/decrypt - \param[in] in Pointer to input date buffer - \param[in] in_len Input data buffer length - \param[in] out Pointer to output date buffer - \param[in] out_len Onput data buffer length - \param[in] is_enc 1 incrypt 0 decrypt - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_dev_info_crypt(const uint8_t *in, uint32_t in_len, - uint8_t *out, uint32_t *out_len, - uint8_t is_enc); - -/** - \brief TEE device info encrypt - \param[in] in Pointer to input date buffer - \param[in] in_len Input data buffer length - \param[in] out Pointer to output date buffer - \param[in] out_len Onput data buffer length - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_dev_info_encrypt(in, in_len, out, out_len) \ - csi_tee_dev_info_crypt(in, in_len, out, out_len, 1) - -/** - \brief TEE device info decrypt - \param[in] in Pointer to input date buffer - \param[in] in_len Input data buffer length - \param[in] out Pointer to output date buffer - \param[in] out_len Onput data buffer length - \return Return 0 if successful,otherwise error code -*/ -#define csi_tee_dev_info_decrypt(in, in_len, out, out_len) \ - csi_tee_dev_info_crypt(in, in_len, out, out_len, 0) - -/** - \brief Set system frequence - \param[in] clk_src Indicate clock source type - \param[in] clk_val System freqence to be set - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_set_sys_freq(uint32_t clk_src, uint32_t clk_val); - -/** - \brief Get system frequence - \param[in] clk_val Value address to store system freqence - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_get_sys_freq(uint32_t *clk_val); - -/** - \brief Read system register - \param[in] addr Indicate register address - \param[out] val Value to read from the address - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_read_reg(uint32_t addr, uint32_t *val); - -/** - \brief Wrte system register - \param[in] addr Indicate register address - \param[in] val Value to be written into the address - \return Return 0 if successful,otherwise error code -*/ -int32_t csi_tee_write_reg(uint32_t addr, uint32_t val); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_TEE_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/tipc.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/tipc.h deleted file mode 100755 index da117ebc..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/tipc.h +++ /dev/null @@ -1,56 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/tipc.h - * @brief Header File for TIPC Driver - * @version V1.0 - * @date 08. Mar 2020 - * @model tipc - ******************************************************************************/ - -#ifndef _DRV_TIPC_H_ -#define _DRV_TIPC_H_ - -#include <stdint.h> -#include <stdbool.h> -#include <csi_core.h> -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - uint32_t ip; - uint16_t dev_tag; - uint8_t idx; -} csi_tipcmap_t; - -/** - \brief Config the tipc module properity - \param[in] dev Dev handle \ref csi_dev_t - \param[in] is_secure is secure or not -*/ -csi_error_t csi_dev_secure_config(csi_dev_t *dev, bool is_secure); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_TIPC_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/usi.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/usi.h deleted file mode 100755 index 8e8cb1d3..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/usi.h +++ /dev/null @@ -1,42 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/usi.h - * @brief Header File for USI Driver - * @version V1.0 - * @date 02. June 2020 - * @model usi - ******************************************************************************/ - -#ifndef _DRV_USI_H_ -#define _DRV_USI_H_ - -#include <drv/usi_iic.h> -#include <drv/usi_spi.h> -#include <drv/usi_usart.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_USI_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/usi_iic.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/usi_iic.h deleted file mode 100755 index 257b534a..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/usi_iic.h +++ /dev/null @@ -1,260 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/drv_usi_iic.h - * @brief Header File for IIC driver - * @version V1.0 - * @date 02. June 2020 - * @model usi_iic - ******************************************************************************/ - -#ifndef _DRV_USI_IIC_H_ -#define _DRV_USI_IIC_H_ - -#include <stdint.h> -#include <stdbool.h> -#include <drv/common.h> -#include <drv/iic.h> -#ifdef __cplusplus -extern "C" { -#endif - -/** - \brief Init iic ctrl block. - Initializes the resources needed for the iic instance. - \param[in] iic Handle of iic instance. - \param[in] idx Index of instance. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_init(csi_iic_t *iic, uint32_t idx); - -/** - \brief Uninit iic ctrl block. - Stops operation and releases the software resources used by the instance. - \param[in] iic Handle of iic instance. -*/ -void csi_usi_iic_uninit(csi_iic_t *iic); - -/** - \brief Config iic master or slave mode. - \param[in] iic Handle of iic instance. - \param[in] mode IIC mode \ref csi_iic_mode_t. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_mode(csi_iic_t *iic, csi_iic_mode_t mode); - -/** - \brief Config iic addr mode. - \param[in] iic Handle of iic instance. - \param[in] addr_mode IIC addr mode \ref csi_iic_addr_mode_t. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_addr_mode(csi_iic_t *iic, csi_iic_addr_mode_t addr_mode); - -/** - \brief Config iic speed. - \param[in] iic Handle of iic instance. - \param[in] speed iic speed mode \ref csi_iic_speed_t. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_speed(csi_iic_t *iic, csi_iic_speed_t speed); - -/** - \brief Config iic own addr. - \param[in] iic Handle of iic instance. - \param[in] own_addr IIC set own addr at slave mode. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_own_addr(csi_iic_t *iic, uint32_t own_addr); - -/** - \brief Start sending data as iic master. - This function is blocking. - \param[in] iic Handle of iic instance. - \param[in] devaddr Addrress of slave device. - \param[in] data Pointer to send data buffer. - \param[in] size Size of data items to send. - \param[in] timout Unit of time delay(ms). - \return The amount of real data sent. -*/ -int32_t csi_usi_iic_master_send(csi_iic_t *iic, uint32_t devaddr, const void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start receiving data as iic master. - This function is blocking. - \param[in] iic Handle to operate. - \param[in] devaddr IIC addrress of slave device. - \param[out] data Pointer to buffer for data to receive from iic receiver. - \param[in] size Size of data items to receive. - \param[in] timeout Unit of time delay(ms). - \return The amount of real data received. -*/ -int32_t csi_usi_iic_master_receive(csi_iic_t *iic, uint32_t devaddr, void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start sending data as iic master. - This function is non-blocking,\ref csi_usi_iic_event_t is signaled when transfer completes or error happens. - \param[in] iic Handle to operate. - \param[in] devaddr IIC addrress of slave device. - \param[in] data Pointer to send data buffer. - \param[in] size Size of data items to send. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_master_send_async(csi_iic_t *iic, uint32_t devaddr, const void *data, uint32_t size); - -/** - \brief Start receiving data as iic master. - This function is non-blocking.\ref csi_usi_iic_event_t is signaled when transfer completes or error happens. - \param[in] iic Handle to operate. - \param[in] devaddr IIC addrress of slave device. - \param[out] data Pointer to buffer for data to receive from iic receiver. - \param[in] size Size of data items to receive. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_master_receive_async(csi_iic_t *iic, uint32_t devaddr, void *data, uint32_t size); - -/** - \brief Start sending data as iic master. - This function is blocking. - \param[in] iic Handle of iic instance. - \param[in] devaddr Addrress of slave device. - \param[in] memaddr Internal addr of device. - \param[in] memaddr_size Internal addr mode of device. - \param[in] data Pointer to send data buffer. - \param[in] size Size of data items to send. - \param[in] timout Unit of time delay(ms). - \return The amount of real data sent. -*/ -int32_t csi_usi_iic_mem_send(csi_iic_t *iic, uint32_t devaddr, uint16_t memaddr, csi_iic_mem_addr_size_t memaddr_size, const void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start receiving data as iic master. - This function is blocking. - \param[in] iic Handle to operate. - \param[in] devaddr IIC addrress of slave device. - \param[in] memaddr Internal addr of device. - \param[in] memaddr_mode Internal addr mode of device. - \param[out] data Pointer to buffer for data to receive from eeprom device. - \param[in] size Size of data items to receive. - \param[in] timeout Unit of time delay(ms). - \return The amount of real data received. -*/ -int32_t csi_usi_iic_mem_receive(csi_iic_t *iic, uint32_t devaddr, uint16_t memaddr, csi_iic_mem_addr_size_t memaddr_size, void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start sending data as iic slave. - This function is blocking. - \param[in] iic Handle to operate. - \param[in] data Pointer to buffer with data to send to iic master. - \param[in] size Size of data items to send. - \param[in] timeout Unit of time delay(ms). - \return The amount of real data sent. -*/ -int32_t csi_usi_iic_slave_send(csi_iic_t *iic, const void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start receiving data as iic slave. - This function is blocking. - \param[in] iic Handle to operate. - \param[out] data Pointer to buffer for data to receive from iic master. - \param[in] size Size of data items to receive. - \param[in] timeout Unit of time delay(ms). - \return The amount of real data received. -*/ -int32_t csi_usi_iic_slave_receive(csi_iic_t *iic, void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start sending data as iic slave. - This function is non-blocking,\ref csi_usi_iic_event_t is signaled when transfer completes or error happens. - \param[in] iic Handle to operate. - \param[in] data Pointer to buffer with data to send to iic master. - \param[in] size size of data items to send. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_slave_send_async(csi_iic_t *iic, const void *data, uint32_t size); - -/** - \brief Start receiving data as iic slave. - This function is non-blocking,\ref csi_usi_iic_event_t is signaled when transfer completes or error happens. - \param[in] handle IIC handle to operate. - \param[out] data Pointer to buffer for data to receive from iic master. - \param[in] size Size of data items to receive. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_slave_receive_async(csi_iic_t *iic, void *data, uint32_t size); - -/** - \brief Attach callback to the iic. - \param[in] iic IIC handle to operate. - \param[in] cb Event callback function \ref csi_usi_iic_callback_t. - \param[in] arg User private param for event callback. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_attach_callback(csi_iic_t *iic, void *callback, void *arg); - -/** - \brief Detach callback from the iic. - \param[in] iic IIC handle to operate. - \return \ref csi_error_t. -*/ -void csi_usi_iic_detach_callback(csi_iic_t *iic); - -/** - \brief Config iic stop to generate. - \param[in] iic IIC handle to operate. - \param[in] enable Transfer operation is pending - stop condition will not be generated. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_xfer_pending(csi_iic_t *iic, bool enable); - -/** - \brief Link DMA channel to iic device. - \param[in] iic Handle to operate. - \param[in] tx_dma The DMA channel handle for send, when it is NULL means to unlink the channel. - \param[in] rx_dma The DMA channel handle for receive, when it is NULL means to unlink the channel. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_link_dma(csi_iic_t *iic, csi_dma_ch_t *tx_dma, csi_dma_ch_t *rx_dma); - -/** - \brief Get iic state. - \param[in] iic Handle to operate. - \param[out] state IIC state \ref csi_state_t. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_get_state(csi_iic_t *iic, csi_state_t *state); - -/** - \brief Enable iic power manage. - \param[in] iic IIC handle to operate. - \return \ref csi_error_t. -*/ -csi_error_t csi_usi_iic_enable_pm(csi_iic_t *iic); - -/** - \brief Disable iic power manage. - \param[in] iic IIC handle to operate. -*/ -void csi_usi_iic_disable_pm(csi_iic_t *iic); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_USI_IIC_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/usi_spi.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/usi_spi.h deleted file mode 100755 index eaa1f3e3..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/usi_spi.h +++ /dev/null @@ -1,229 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/usi_spi.h - * @brief Header File for SPI Driver - * @version V1.0 - * @date 02. June 2020 - * @model usi_spi - ******************************************************************************/ - -#ifndef _DRV_SPI_USI_H_ -#define _DRV_SPI_USI_H_ - -#include <stdint.h> -#include <drv/common.h> -#include <drv/spi.h> -#ifdef __cplusplus -extern "C" { -#endif - -/** - \brief Initialize SPI Interface. - Initializes the resources needed for the SPI instance - \param[in] spi SPI handle - \param[in] idx SPI instance index - \return Error code -*/ -csi_error_t csi_usi_spi_init(csi_spi_t *spi, uint32_t idx); - -/** - \brief De-initialize SPI Interface - Stops operation and releases the software resources used by the spi instance - \param[in] spi SPI handle - \return None -*/ -void csi_usi_spi_uninit(csi_spi_t *spi); - -/** - \brief Attach the callback handler to SPI - \param[in] spi Operate handle. - \param[in] callback Callback function - \param[in] arg User can define it by himself as callback's param - \return Error code -*/ -csi_error_t csi_usi_spi_attach_callback(csi_spi_t *spi, void *callback, void *arg); - -/** - \brief Detach the callback handler - \param[in] spi Operate handle. - \return None -*/ -void csi_usi_spi_detach_callback(csi_spi_t *spi); - - -/** - \brief Config spi mode (master or slave). - \param[in] spi SPI handle - \param[in] mode The mode of spi (master or slave) - \return Error code -*/ -csi_error_t csi_usi_spi_mode(csi_spi_t *spi, csi_spi_mode_t mode); - -/** - \brief Config spi cp format. - \param[in] spi SPI handle - \param[in] format SPI cp format - \return Error code -*/ -csi_error_t csi_usi_spi_cp_format(csi_spi_t *spi, csi_spi_cp_format_t format); - -/** - \brief Config spi frame len. - \param[in] spi SPI handle - \param[in] length spi frame len - \return error code -*/ -csi_error_t csi_usi_spi_frame_len(csi_spi_t *spi, csi_spi_frame_len_t length); - -/** - \brief Config spi work frequence. - \param[in] spi SPI handle - \param[in] baud SPI work baud - \return The actual config frequency -*/ -uint32_t csi_usi_spi_baud(csi_spi_t *spi, uint32_t baud); - -/** - \brief Config spi mode. - \param[in] Handle spi handle to operate. - \param[in] baud SPI baud rate. If negative, then this attribute not changed - \param[in] mode \ref spi_mode_e . If negative, then this attribute not changed - \param[in] format \ref spi_format_e . If negative, then this attribute not changed - \param[in] order \ref spi_bit_order_e . If negative, then this attribute not changed - \param[in] ss_mode \ref spi_ss_mode_t . If negative, then this attribute not changed - \param[in] bit_width SPI data bitwidth: (1 ~ SPI_DATAWIDTH_MAX) . If negative, then this attribute not changed - \return Error code -*/ -csi_error_t drv_usi_spi_config(csi_spi_t *spi, csi_spi_mode_t mode, csi_spi_frame_len_t width, csi_spi_cp_format_t format); - -/** - \brief Sending data to SPI transmitter,(received data is ignored). - Blocking mode ,return unti all data has been sent or err happened - \param[in] spi Handle to operate. - \param[in] data Pointer to buffer with data to send to SPI transmitter. - \param[in] size Number of data to send(byte) - \param[in] timeout Unit in mini-second - \return If send success, this function shall return the num of data witch is sent successful - otherwise, the function shall return error code -*/ -int32_t csi_usi_spi_send(csi_spi_t *spi, const void *data, uint32_t size, uint32_t timeout); - -/** - \brief Sending data to SPI transmitter,(received data is ignored). - non-blocking mode,transfer done event will be signaled by driver - \param[in] spi Handle to operate. - \param[in] data Pointer to buffer with data to send to SPI transmitter. - \param[in] size Number of data items to send(byte) - \return Error code -*/ -csi_error_t csi_usi_spi_send_async(csi_spi_t *spi, const void *data, uint32_t size); - -/** - \brief Receiving data from SPI receiver. - Blocking mode, return untill curtain data items are readed - \param[in] spi Handle to operate. - \param[out] data Pointer to buffer for data to receive from SPI receiver - \param[in] size Number of data items to receive(byte) - \param[in] timeout Unit in mini-second - \return If receive success, this function shall return the num of data witch is received successful - Otherwise, the function shall return error code -*/ -int32_t csi_usi_spi_receive(csi_spi_t *spi, void *data, uint32_t size, uint32_t timeout); - -/** - \brief Receiving data from SPI receiver. - Not-blocking mode, event will be signaled when receive done or err happend - \param[in] spi Handle to operate. - \param[out] data Pointer to buffer for data to receive from SPI receiver - \param[in] size Number of data items to receive(byte) - \return Error code -*/ -csi_error_t csi_usi_spi_receive_async(csi_spi_t *spi, void *data, uint32_t size); - -/** - \brief Dulplex,sending and receiving data at the same time - \ref csi_spi_event_t is signaled when operation completes or error happens. - \ref csi_spi_get_state can get operation status. - Blocking mode, this function returns after operation completes or error happens. - \param[in] Handle spi handle to operate. - \param[in] data_out Pointer to buffer with data to send to SPI transmitter - \param[out] data_in Pointer to buffer for data to receive from SPI receiver - \param[in] size Data size(byte) - \return If transfer success, this function shall return the num of data witch is transfer successful - otherwise, the function shall return error code -*/ -int32_t csi_usi_spi_send_receive(csi_spi_t *spi, const void *data_out, void *data_in, uint32_t size, uint32_t timeout); - -/** - \brief Transmit first then receive ,receive will begin after transmit is done - if non-blocking mode, this function only starts the transfer, - \ref csi_spi_event_t is signaled when operation completes or error happens. - \ref csi_spi_get_state can get operation status. - \param[in] handle spi Handle to operate. - \param[in] data_out Pointer to buffer with data to send to SPI transmitter - \param[out] data_in Pointer to buffer for data to receive from SPI receiver - \param[in] size Data size(byte) - \return Error code -*/ -csi_error_t csi_usi_spi_send_receive_async(csi_spi_t *spi, const void *data_out, void *data_in, uint32_t size); - -/* - \brief Set slave select num. Only valid for master - \param[in] Handle spi handle to operate. - \param[in] slave_num SPI slave num. - \return None - */ -void csi_usi_spi_select_slave(csi_spi_t *spi, uint32_t slave_num); - -/** - \brief Link DMA channel to spi device - \param[in] spi SPI handle to operate. - \param[in] tx_dma The DMA channel handle for send, when it is NULL means to unlink the channel - \param[in] rx_dma The DMA channel handle for receive, when it is NULL means to unlink the channel - \return Error code -*/ -csi_error_t csi_usi_spi_link_dma(csi_spi_t *spi, csi_dma_ch_t *tx_dma, csi_dma_ch_t *rx_dma); - -/** - \brief Get the state of spi device - \param[in] spi SPI handle to operate. - \param[out] state The state of spi device - \return Error code -*/ -csi_error_t csi_usi_spi_get_state(csi_spi_t *spi, csi_state_t *state); - -/** - \brief Enable spi power manage - \param[in] spi SPI handle to operate. - \return Error code -*/ -csi_error_t csi_usi_spi_enable_pm(csi_spi_t *spi); - -/** - \brief Disable spi power manage - \param[in] spi SPI handle to operate. - \return Error code -*/ -void csi_spi_disable_pm(csi_spi_t *spi); -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_SPI_USI_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/usi_usart.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/usi_usart.h deleted file mode 100755 index 59bfe554..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/usi_usart.h +++ /dev/null @@ -1,192 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/usi_usart.h - * @brief Header File for USART Driver - * @version V1.0 - * @date 02. June 2020 - * @model usi_usart - ******************************************************************************/ - -#ifndef _DRV_USI_USART_H_ -#define _DRV_USI_USART_H_ - -#include <drv/common.h> -#include <drv/uart.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - \brief Initialize UART Interface. 1. Initializes the resources needed for the UART interface 2.registers event callback function - \param[in] uart Operate handle. - \param[in] idx The device idx - \param[in] cb_event Event call back function \ref uart_event_cb_t - \param[in] arg User can define it by himself - \return error code -*/ -csi_error_t csi_usi_uart_init(csi_uart_t *uart, uint32_t idx); - -/** - \brief De-initialize UART Interface. stops operation and releases the software resources used by the interface - \param[in] uart Operate handle. - \return Error code -*/ -void csi_usi_uart_uninit(csi_uart_t *uart); - -/** - \brief Attach the callback handler to UART - \param[in] uart Operate handle. - \param[in] cb Callback function - \param[in] arg User can define it by himself as callback's param - \return Error code -*/ -csi_error_t csi_usi_uart_attach_callback(csi_uart_t *uart, void * cb, void *arg); - -/** - \brief Detach the callback handler - \param[in] uart Operate handle. -*/ -void csi_usi_uart_detach_callback(csi_uart_t *uart); - -/** - \brief Config the baudrate. - \param[in] uart UART handle to operate. - \param[in] baud UART baudrate - \return Error code -*/ -csi_error_t csi_usi_uart_baud(csi_uart_t *uart, uint32_t baud); - -/** - \brief Config the uart format. - \param[in] uart UART handle to operate. - \param[in] data_bit UART data bits - \param[in] parity UART data parity - \param[in] stop_bit UART stop bits - \return Error code -*/ -csi_error_t csi_usi_uart_format(csi_uart_t *uart, csi_uart_data_bits_t data_bits, - csi_uart_parity_t parity, csi_uart_stop_bits_t stop_bits); - -/** - \brief Config the uart flow control. - \param[in] uart UART handle to operate. - \param[in] flowctrl UART flow control - \return Error code -*/ -csi_error_t csi_usi_uart_flowctrl(csi_uart_t *uart, csi_uart_flowctrl_t flowctrl); - -/** - \brief Start sending data to UART transmitter. - \param[in] uart UART handle to operate. - \param[in] data Pointer to buffer with data to send to UART transmitter. data_type is : uint8_t for 5..8 data bits, uint16_t for 9 data bits - \param[in] num Number of data items to send (byte) - \param[in] Timeout is the number of queries, not time - \return The num of data witch is send successful -*/ -int32_t csi_usi_uart_send(csi_uart_t *uart, const void *data, uint32_t size, uint32_t timeout); - -/** - \brief Start sending data to UART transmitter (interrupt mode). - \param[in] uart UART handle to operate. - \param[in] data Pointer to buffer with data to send to UART transmitter. data_type is : uint8_t for 5..8 data bits, uint16_t for 9 data bits - \param[in] num Number of data items to send - \return The status of send func -*/ -csi_error_t csi_usi_uart_send_async(csi_uart_t *uart, const void *data, uint32_t size); - -/** - \brief Get the num of data in RX_FIFO. - \param[in] uart UART handle to operate. - \return The num of data in RX_FIFO -*/ -uint32_t csi_usi_uart_get_recvfifo_waiting_num(csi_uart_t *uart); - -/** - \brief Start receiving data from UART receiver. \n - This function is non-blocking,\ref uart_event_e is signaled when operation completes or error happens. - \ref csi_uart_get_status can get operation status. - \param[in] uart UART handle to operate. - \param[out] data Pointer to buffer for data to receive from UART receiver.data_type is : uint8_t for 5..8 data bits, uint16_t for 9 data bits - \param[in] num Number of data items to receive - \return Error code -*/ -csi_error_t csi_usi_uart_receive_async(csi_uart_t *uart, void *data, uint32_t size); - -/** - \brief Query data from UART receiver FIFO. - \param[in] uart UART handle to operate. - \param[out] data Pointer to buffer for data to receive from UART receiver - \param[in] num Number of data items to receive - \param[in] Timeout is the number of queries, not time - \return FIFO data num to receive -*/ -int32_t csi_usi_uart_receive(csi_uart_t *uart, void *data, uint32_t size, uint32_t timeout); - -/** - \brief Get character in query mode. - \param[in] uart UART handle to operate. - \param[out] ch The pointer to the received character. - \return Error code -*/ -uint8_t csi_usi_uart_getchar(csi_uart_t *uart); - -/** - \brief Transmit character in query mode. - \param[in] uart UART handle to operate. - \param[in] ch The input character - \return Error code -*/ -void csi_usi_uart_putchar(csi_uart_t *uart, uint8_t ch); - -/** - \brief Link DMA channel to uart device - \param[in] uart UART handle to operate. - \param[in] tx_dma The DMA channel handle for send, when it is NULL means to unlink the channel - \param[in] rx_dma The DMA channel handle for receive, when it is NULL means to unlink the channel - \return Error code -*/ -csi_error_t csi_usi_uart_link_dma(csi_uart_t *uart, csi_dma_ch_t *tx_dma, csi_dma_ch_t *rx_dma); - -/** - \brief Get the state of uart device. - \param[in] uart UART handle to operate. - \param[out] state The state of uart device. - \return Error code. -*/ -csi_error_t csi_usi_uart_get_state(csi_uart_t *uart, csi_state_t *state); - -/** - \brief Enable uart power manage. - \param[in] uart UART handle to operate. - \return Error code. -*/ -csi_error_t csi_usi_uart_enable_pm(csi_uart_t *uart); - -/** - \brief Disable uart power manage. - \param[in] uart UART handle to operate. -*/ -void csi_usi_uart_disable_pm(csi_uart_t *uart); -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_USI_USART_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/wdt.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/wdt.h deleted file mode 100755 index d7a824ec..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/drv/wdt.h +++ /dev/null @@ -1,139 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file drv/wdt.h - * @brief Header File for WDT Driver - * @version V1.0 - * @date 9. Oct 2020 - * @model wdt - ******************************************************************************/ - -#ifndef _DRV_WDT_H_ -#define _DRV_WDT_H_ - -#include <drv/common.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct csi_wdt csi_wdt_t; - -struct csi_wdt { - csi_dev_t dev; - void (*callback)(csi_wdt_t *wdt, void *arg); - void *arg; - void *priv; -}; - -/** - \brief Initialize WDT interface. Initializes the resources needed for the WDT interface - \param[in] wdt Handle to operate - \param[in] idx WDT index - \return Error code \ref csi_error_t -*/ -csi_error_t csi_wdt_init(csi_wdt_t *wdt, uint32_t idx); - -/** - \brief De-initialize WDT interface. Stops operation and releases the software resources used by the interface - \param[in] wdt Handle to operate - \return None -*/ -void csi_wdt_uninit(csi_wdt_t *wdt); - -/** - \brief Set the WDT value - \param[in] wdt Handle to operate - \param[in] ms The timeout value(ms) - \return Error code \ref csi_error_t -*/ -csi_error_t csi_wdt_set_timeout(csi_wdt_t *wdt, uint32_t ms); - -/** - \brief Start the WDT - \param[in] wdt Handle to operate - \return Error code \ref csi_error_t -*/ -csi_error_t csi_wdt_start(csi_wdt_t *wdt); - -/** - \brief Stop the WDT - \param[in] wdt Handle to operate - \return None -*/ -void csi_wdt_stop(csi_wdt_t *wdt); - -/** - \brief Feed the WDT - \param[in] wdt Handle to operate - \return Error code \ref csi_error_t -*/ -csi_error_t csi_wdt_feed(csi_wdt_t *wdt); - -/** - \brief Get the remaining time to timeout - \param[in] wdt Handle to operate - \return The remaining time of WDT(ms) -*/ -uint32_t csi_wdt_get_remaining_time(csi_wdt_t *wdt); - -/** - \brief Check WDT is running - \param[in] wdt Handle to operate - \return - true - WDT is running - false - WDT is stopped -*/ -bool csi_wdt_is_running(csi_wdt_t *wdt); - -/** - \brief Attach the callback handler to WDT - \param[in] wdt Handle to operate - \param[in] callback Callback function - \param[in] arg Callback's param - \return Error code \ref csi_error_t -*/ -csi_error_t csi_wdt_attach_callback(csi_wdt_t *wdt, void *callback, void *arg); - -/** - \brief Detach the callback handler - \param[in] wdt Handle to operate - \return None -*/ -void csi_wdt_detach_callback(csi_wdt_t *wdt); - -/** - \brief Enable WDT power manage - \param[in] wdt Handle to operate - \return Error code \ref csi_error_t -*/ -csi_error_t csi_wdt_enable_pm(csi_wdt_t *wdt); - -/** - \brief Disable WDT power manage - \param[in] wdt Handle to operate - \return None -*/ -void csi_wdt_disable_pm(csi_wdt_t *wdt); - -#ifdef __cplusplus -} -#endif - -#endif /* _DRV_WDT_H_ */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csi_common_tables.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csi_common_tables.h deleted file mode 100644 index 7d5e4028..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csi_common_tables.h +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Copyright (C) 2016-2019 C-SKY Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file csi_common_tables.h - * @brief This file has extern declaration for common tables like - * Bitreverse, reciprocal etc which are used across different functions. - * @version V1.0 - * @date 20. Dec 2016 - ******************************************************************************/ - -#ifndef _CSI_COMMON_TABLES_H -#define _CSI_COMMON_TABLES_H - -#include "csi_math.h" - -extern const uint16_t csiBitRevTable[1024]; -extern const q15_t csiRecipTableQ15[64]; -extern const q31_t csiRecipTableQ31[64]; -extern const uint32_t twiddleCoef_16[32]; -extern const uint32_t twiddleCoef_32[64]; -extern const uint32_t twiddleCoef_64[128]; -extern const uint32_t twiddleCoef_128[256]; -extern const uint32_t twiddleCoef_256[512]; -extern const uint32_t twiddleCoef_512[1024]; -extern const uint32_t twiddleCoef_1024[2048]; -extern const uint32_t twiddleCoef_2048[4096]; -extern const uint32_t twiddleCoef_4096[8192]; -extern const q31_t twiddleCoef_16_q31[24]; -extern const q31_t twiddleCoef_32_q31[48]; -extern const q31_t twiddleCoef_64_q31[96]; -extern const q31_t twiddleCoef_128_q31[192]; -extern const q31_t twiddleCoef_256_q31[384]; -extern const q31_t twiddleCoef_512_q31[768]; -extern const q31_t twiddleCoef_1024_q31[1536]; -extern const q31_t twiddleCoef_2048_q31[3072]; -extern const q31_t twiddleCoef_4096_q31[6144]; -extern const q15_t twiddleCoef_16_q15[24]; -extern const q15_t twiddleCoef_32_q15[48]; -extern const q15_t twiddleCoef_64_q15[96]; -extern const q15_t twiddleCoef_128_q15[192]; -extern const q15_t twiddleCoef_256_q15[384]; -extern const q15_t twiddleCoef_512_q15[768]; -extern const q15_t twiddleCoef_1024_q15[1536]; -extern const q15_t twiddleCoef_2048_q15[3072]; -extern const q15_t twiddleCoef_4096_q15[6144]; -extern const float32_t twiddleCoef_rfft_32[32]; -extern const float32_t twiddleCoef_rfft_64[64]; -extern const float32_t twiddleCoef_rfft_128[128]; -extern const float32_t twiddleCoef_rfft_256[256]; -extern const float32_t twiddleCoef_rfft_512[512]; -extern const float32_t twiddleCoef_rfft_1024[1024]; -extern const float32_t twiddleCoef_rfft_2048[2048]; -extern const float32_t twiddleCoef_rfft_4096[4096]; -extern const float32_t twiddleCoef_rfft_8192[8192]; - -extern const q15_t twiddleCoef_fast_16_q15[24]; -extern const q15_t twiddleCoef_fast_32_q15[56]; -extern const q15_t twiddleCoef_fast_64_q15[120]; -extern const q15_t twiddleCoef_fast_128_q15[248]; -extern const q15_t twiddleCoef_fast_256_q15[504]; -extern const q15_t twiddleCoef_fast_512_q15[1016]; -extern const q15_t twiddleCoef_fast_1024_q15[2040]; -extern const q15_t twiddleCoef_fast_2048_q15[4088]; -extern const q15_t twiddleCoef_fast_4096_q15[8184]; - -extern const q31_t twiddleCoef_fast_16_q31[24]; -extern const q31_t twiddleCoef_fast_32_q31[56]; -extern const q31_t twiddleCoef_fast_64_q31[120]; -extern const q31_t twiddleCoef_fast_128_q31[248]; -extern const q31_t twiddleCoef_fast_256_q31[504]; -extern const q31_t twiddleCoef_fast_512_q31[1016]; -extern const q31_t twiddleCoef_fast_1024_q31[2040]; -extern const q31_t twiddleCoef_fast_2048_q31[4088]; -extern const q31_t twiddleCoef_fast_4096_q31[8184]; - -extern const uint32_t twiddleCoef_fast_16[24]; -extern const uint32_t twiddleCoef_fast_32[56]; -extern const uint32_t twiddleCoef_fast_64[120]; -extern const uint32_t twiddleCoef_fast_128[248]; -extern const uint32_t twiddleCoef_fast_256[504]; -extern const uint32_t twiddleCoef_fast_512[1016]; -extern const uint32_t twiddleCoef_fast_1024[2040]; -extern const uint32_t twiddleCoef_fast_2048[4088]; -extern const uint32_t twiddleCoef_fast_4096[8184]; - -extern const q15_t realCoefAQ15_8192[8192]; -extern const q31_t realCoefAQ31_8192[8192]; -extern const q15_t realCoefBQ15_8192[8192]; -extern const q31_t realCoefBQ31_8192[8192]; - -/*Tables for RFFT.*/ -extern const q15_t ALIGN4 realCoefAQ15_32[32]; -extern const q15_t ALIGN4 realCoefAQ15_64[64]; -extern const q15_t ALIGN4 realCoefAQ15_128[128]; -extern const q15_t ALIGN4 realCoefAQ15_256[256]; -extern const q15_t ALIGN4 realCoefAQ15_512[512]; -extern const q15_t ALIGN4 realCoefAQ15_1024[1024]; -extern const q15_t ALIGN4 realCoefAQ15_2048[2048]; -extern const q15_t ALIGN4 realCoefAQ15_4096[4096]; - -extern const q15_t ALIGN4 realCoefBQ15_32[32]; -extern const q15_t ALIGN4 realCoefBQ15_64[64]; -extern const q15_t ALIGN4 realCoefBQ15_128[128]; -extern const q15_t ALIGN4 realCoefBQ15_256[256]; -extern const q15_t ALIGN4 realCoefBQ15_512[512]; -extern const q15_t ALIGN4 realCoefBQ15_1024[1024]; -extern const q15_t ALIGN4 realCoefBQ15_2048[2048]; -extern const q15_t ALIGN4 realCoefBQ15_4096[4096]; - -extern const q31_t realCoefAQ31_32[32]; -extern const q31_t realCoefAQ31_64[64]; -extern const q31_t realCoefAQ31_128[128]; -extern const q31_t realCoefAQ31_256[256]; -extern const q31_t realCoefAQ31_512[512]; -extern const q31_t realCoefAQ31_1024[1024]; -extern const q31_t realCoefAQ31_2048[2048]; -extern const q31_t realCoefAQ31_4096[4096]; - -extern const q31_t realCoefBQ31_32[32]; -extern const q31_t realCoefBQ31_64[64]; -extern const q31_t realCoefBQ31_128[128]; -extern const q31_t realCoefBQ31_256[256]; -extern const q31_t realCoefBQ31_512[512]; -extern const q31_t realCoefBQ31_1024[1024]; -extern const q31_t realCoefBQ31_2048[2048]; -extern const q31_t realCoefBQ31_4096[4096]; - - -extern const float32_t realCoefA[8192]; -extern const float32_t realCoefB[8192]; - -extern const csi_cfft_instance_q15 csi_cfft_fast_sR_q15_len16; -extern const csi_cfft_instance_q15 csi_cfft_fast_sR_q15_len32; -extern const csi_cfft_instance_q15 csi_cfft_fast_sR_q15_len64; -extern const csi_cfft_instance_q15 csi_cfft_fast_sR_q15_len128; -extern const csi_cfft_instance_q15 csi_cfft_fast_sR_q15_len256; -extern const csi_cfft_instance_q15 csi_cfft_fast_sR_q15_len512; -extern const csi_cfft_instance_q15 csi_cfft_fast_sR_q15_len1024; -extern const csi_cfft_instance_q15 csi_cfft_fast_sR_q15_len2048; -extern const csi_cfft_instance_q15 csi_cfft_fast_sR_q15_len4096; - -extern const csi_cfft_instance_q31 csi_cfft_fast_sR_q31_len16; -extern const csi_cfft_instance_q31 csi_cfft_fast_sR_q31_len32; -extern const csi_cfft_instance_q31 csi_cfft_fast_sR_q31_len64; -extern const csi_cfft_instance_q31 csi_cfft_fast_sR_q31_len128; -extern const csi_cfft_instance_q31 csi_cfft_fast_sR_q31_len256; -extern const csi_cfft_instance_q31 csi_cfft_fast_sR_q31_len512; -extern const csi_cfft_instance_q31 csi_cfft_fast_sR_q31_len1024; -extern const csi_cfft_instance_q31 csi_cfft_fast_sR_q31_len2048; -extern const csi_cfft_instance_q31 csi_cfft_fast_sR_q31_len4096; - -extern csi_rfft_fast_instance_q15 csi_rfft_fast_sR_q15_len32; -extern csi_rfft_fast_instance_q15 csi_rfft_fast_sR_q15_len64; -extern csi_rfft_fast_instance_q15 csi_rfft_fast_sR_q15_len128; -extern csi_rfft_fast_instance_q15 csi_rfft_fast_sR_q15_len256; -extern csi_rfft_fast_instance_q15 csi_rfft_fast_sR_q15_len512; -extern csi_rfft_fast_instance_q15 csi_rfft_fast_sR_q15_len1024; -extern csi_rfft_fast_instance_q15 csi_rfft_fast_sR_q15_len2048; -extern csi_rfft_fast_instance_q15 csi_rfft_fast_sR_q15_len4096; -extern csi_rfft_fast_instance_q15 csi_rfft_fast_sR_q15_len8192; - -extern csi_rfft_fast_instance_q15 csi_inv_rfft_fast_sR_q15_len32; -extern csi_rfft_fast_instance_q15 csi_inv_rfft_fast_sR_q15_len64; -extern csi_rfft_fast_instance_q15 csi_inv_rfft_fast_sR_q15_len128; -extern csi_rfft_fast_instance_q15 csi_inv_rfft_fast_sR_q15_len256; -extern csi_rfft_fast_instance_q15 csi_inv_rfft_fast_sR_q15_len512; -extern csi_rfft_fast_instance_q15 csi_inv_rfft_fast_sR_q15_len1024; -extern csi_rfft_fast_instance_q15 csi_inv_rfft_fast_sR_q15_len2048; -extern csi_rfft_fast_instance_q15 csi_inv_rfft_fast_sR_q15_len4096; -extern csi_rfft_fast_instance_q15 csi_inv_rfft_fast_sR_q15_len8192; - -extern csi_rfft_fast_instance_q31 csi_rfft_fast_sR_q31_len32; -extern csi_rfft_fast_instance_q31 csi_rfft_fast_sR_q31_len64; -extern csi_rfft_fast_instance_q31 csi_rfft_fast_sR_q31_len128; -extern csi_rfft_fast_instance_q31 csi_rfft_fast_sR_q31_len256; -extern csi_rfft_fast_instance_q31 csi_rfft_fast_sR_q31_len512; -extern csi_rfft_fast_instance_q31 csi_rfft_fast_sR_q31_len1024; -extern csi_rfft_fast_instance_q31 csi_rfft_fast_sR_q31_len2048; -extern csi_rfft_fast_instance_q31 csi_rfft_fast_sR_q31_len4096; -extern csi_rfft_fast_instance_q31 csi_rfft_fast_sR_q31_len8192; - -extern csi_rfft_fast_instance_q31 csi_inv_rfft_fast_sR_q31_len32; -extern csi_rfft_fast_instance_q31 csi_inv_rfft_fast_sR_q31_len64; -extern csi_rfft_fast_instance_q31 csi_inv_rfft_fast_sR_q31_len128; -extern csi_rfft_fast_instance_q31 csi_inv_rfft_fast_sR_q31_len256; -extern csi_rfft_fast_instance_q31 csi_inv_rfft_fast_sR_q31_len512; -extern csi_rfft_fast_instance_q31 csi_inv_rfft_fast_sR_q31_len1024; -extern csi_rfft_fast_instance_q31 csi_inv_rfft_fast_sR_q31_len2048; -extern csi_rfft_fast_instance_q31 csi_inv_rfft_fast_sR_q31_len4096; -extern csi_rfft_fast_instance_q31 csi_inv_rfft_fast_sR_q31_len8192; - -extern csi_dct4_fast_instance_q15 csi_dct4_fast_sR_q15_len128; -extern csi_dct4_fast_instance_q15 csi_dct4_fast_sR_q15_len512; -extern csi_dct4_fast_instance_q15 csi_dct4_fast_sR_q15_len2048; -extern csi_dct4_fast_instance_q15 csi_dct4_fast_sR_q15_len8192; - -extern csi_dct4_fast_instance_q31 csi_dct4_fast_sR_q31_len128; -extern csi_dct4_fast_instance_q31 csi_dct4_fast_sR_q31_len512; -extern csi_dct4_fast_instance_q31 csi_dct4_fast_sR_q31_len2048; -extern csi_dct4_fast_instance_q31 csi_dct4_fast_sR_q31_len8192; - -/*Tables for DCT4*/ -#ifndef CSI_OPT_WEIGHT -extern const q15_t ALIGN4 WeightsQ15_128[256]; -extern const q15_t ALIGN4 WeightsQ15_512[1024]; -extern const q15_t ALIGN4 WeightsQ15_2048[4096]; -extern const q15_t ALIGN4 WeightsQ15_8192[16384]; -#else -extern const q15_t ALIGN4 WeightsQ15_128[128+2]; -extern const q15_t ALIGN4 WeightsQ15_512[512+2]; -extern const q15_t ALIGN4 WeightsQ15_2048[2048+2]; -extern const q15_t ALIGN4 WeightsQ15_8192[8192+2]; -#endif -extern const q15_t ALIGN4 cos_factorsQ15_128[128]; -extern const q15_t ALIGN4 cos_factorsQ15_512[512]; -extern const q15_t ALIGN4 cos_factorsQ15_2048[2048]; -extern const q15_t ALIGN4 cos_factorsQ15_8192[8192]; - -#ifndef CSI_OPT_WEIGHT -extern const q31_t WeightsQ31_128[256]; -extern const q31_t WeightsQ31_512[1024]; -extern const q31_t WeightsQ31_2048[4096]; -extern const q31_t WeightsQ31_8192[16384]; -#else -extern const q31_t WeightsQ31_128[128+2]; -extern const q31_t WeightsQ31_512[512+2]; -extern const q31_t WeightsQ31_2048[2048+2]; -extern const q31_t WeightsQ31_8192[8192+2]; -#endif - -extern const q31_t cos_factorsQ31_128[128]; -extern const q31_t cos_factorsQ31_512[512]; -extern const q31_t cos_factorsQ31_2048[2048]; -extern const q31_t cos_factorsQ31_8192[8192]; - -#ifndef CSI_OPT_WEIGHT -extern const float32_t Weights_128[256]; -extern const float32_t Weights_512[1024]; -extern const float32_t Weights_2048[4096]; -extern const float32_t Weights_8192[16384]; - -#else -extern const float32_t Weights_128[128+2]; -extern const float32_t Weights_512[512+2]; -extern const float32_t Weights_2048[2048+2]; -extern const float32_t Weights_8192[8192+2]; -#endif -extern const float32_t cos_factors_128[128]; -extern const float32_t cos_factors_512[512]; -extern const float32_t cos_factors_2048[2048]; -extern const float32_t cos_factors_8192[8192]; - -/* floating-point bit reversal tables */ -#define CSIBITREVINDEXTABLE_16_TABLE_LENGTH ((uint16_t)20 ) -#define CSIBITREVINDEXTABLE_32_TABLE_LENGTH ((uint16_t)48 ) -#define CSIBITREVINDEXTABLE_64_TABLE_LENGTH ((uint16_t)56 ) -#define CSIBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208 ) -#define CSIBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440 ) -#define CSIBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448 ) -#define CSIBITREVINDEXTABLE_1024_TABLE_LENGTH ((uint16_t)1800) -#define CSIBITREVINDEXTABLE_2048_TABLE_LENGTH ((uint16_t)3808) -#define CSIBITREVINDEXTABLE_4096_TABLE_LENGTH ((uint16_t)4032) - -extern const uint16_t csiBitRevIndexTable16[CSIBITREVINDEXTABLE_16_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable32[CSIBITREVINDEXTABLE_32_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable64[CSIBITREVINDEXTABLE_64_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable128[CSIBITREVINDEXTABLE_128_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable256[CSIBITREVINDEXTABLE_256_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable512[CSIBITREVINDEXTABLE_512_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable1024[CSIBITREVINDEXTABLE_1024_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable2048[CSIBITREVINDEXTABLE_2048_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable4096[CSIBITREVINDEXTABLE_4096_TABLE_LENGTH]; - -/* fixed-point bit reversal tables */ -#define CSIBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH ((uint16_t)12 ) -#define CSIBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH ((uint16_t)24 ) -#define CSIBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH ((uint16_t)56 ) -#define CSIBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH ((uint16_t)112 ) -#define CSIBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH ((uint16_t)240 ) -#define CSIBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH ((uint16_t)480 ) -#define CSIBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992 ) -#define CSIBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984) -#define CSIBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032) - -extern const uint16_t csiBitRevIndexTable_fixed_16[CSIBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable_fixed_32[CSIBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable_fixed_64[CSIBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable_fixed_128[CSIBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable_fixed_256[CSIBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable_fixed_512[CSIBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable_fixed_1024[CSIBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable_fixed_2048[CSIBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH]; -extern const uint16_t csiBitRevIndexTable_fixed_4096[CSIBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH]; - -/* Tables for Fast Math Sine and Cosine */ -extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1]; -extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1]; -extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1]; - -#endif /* CSI_COMMON_TABLES_H */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csi_const_structs.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csi_const_structs.h deleted file mode 100644 index 09f8f367..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csi_const_structs.h +++ /dev/null @@ -1,157 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file csi_const_structs.h - * @brief Constant structs that are initialized for user convenience. - * @version V1.0 - * @date Feb. 2020 - ******************************************************************************/ - - -#ifndef _RISCV_CONST_STRUCTS_H -#define _RISCV_CONST_STRUCTS_H - -#include "csi_math.h" -#include "csi_common_tables.h" - -extern const csi_cfft_instance_f32 csi_cfft_radix4_fast_sR_f32_len16; -extern const csi_cfft_instance_f32 csi_cfft_radix4_fast_sR_f32_len32; -extern const csi_cfft_instance_f32 csi_cfft_radix4_fast_sR_f32_len64; -extern const csi_cfft_instance_f32 csi_cfft_radix4_fast_sR_f32_len128; -extern const csi_cfft_instance_f32 csi_cfft_radix4_fast_sR_f32_len256; -extern const csi_cfft_instance_f32 csi_cfft_radix4_fast_sR_f32_len512; -extern const csi_cfft_instance_f32 csi_cfft_radix4_fast_sR_f32_len1024; -extern const csi_cfft_instance_f32 csi_cfft_radix4_fast_sR_f32_len2048; -extern const csi_cfft_instance_f32 csi_cfft_radix4_fast_sR_f32_len4096; - -extern const csi_cfft_instance_f32 csi_cfft_radix2_sR_f32_len16; -extern const csi_cfft_instance_f32 csi_cfft_radix2_sR_f32_len32; -extern const csi_cfft_instance_f32 csi_cfft_radix2_sR_f32_len64; -extern const csi_cfft_instance_f32 csi_cfft_radix2_sR_f32_len128; -extern const csi_cfft_instance_f32 csi_cfft_radix2_sR_f32_len256; -extern const csi_cfft_instance_f32 csi_cfft_radix2_sR_f32_len512; -extern const csi_cfft_instance_f32 csi_cfft_radix2_sR_f32_len1024; -extern const csi_cfft_instance_f32 csi_cfft_radix2_sR_f32_len2048; -extern const csi_cfft_instance_f32 csi_cfft_radix2_sR_f32_len4096; - -extern const csi_cfft_instance_f32 csi_cfft_radix4_sR_f32_len16; -extern const csi_cfft_instance_f32 csi_cfft_radix4_sR_f32_len32; -extern const csi_cfft_instance_f32 csi_cfft_radix4_sR_f32_len64; -extern const csi_cfft_instance_f32 csi_cfft_radix4_sR_f32_len128; -extern const csi_cfft_instance_f32 csi_cfft_radix4_sR_f32_len256; -extern const csi_cfft_instance_f32 csi_cfft_radix4_sR_f32_len512; -extern const csi_cfft_instance_f32 csi_cfft_radix4_sR_f32_len1024; -extern const csi_cfft_instance_f32 csi_cfft_radix4_sR_f32_len2048; -extern const csi_cfft_instance_f32 csi_cfft_radix4_sR_f32_len4096; - -extern const csi_cfft_instance_f32 csi_cfft_sR_f32_len16 ; -extern const csi_cfft_instance_f32 csi_cfft_sR_f32_len32 ; -extern const csi_cfft_instance_f32 csi_cfft_sR_f32_len64 ; -extern const csi_cfft_instance_f32 csi_cfft_sR_f32_len128 ; -extern const csi_cfft_instance_f32 csi_cfft_sR_f32_len256 ; -extern const csi_cfft_instance_f32 csi_cfft_sR_f32_len512 ; -extern const csi_cfft_instance_f32 csi_cfft_sR_f32_len1024 ; -extern const csi_cfft_instance_f32 csi_cfft_sR_f32_len2048 ; -extern const csi_cfft_instance_f32 csi_cfft_sR_f32_len4096 ; -extern const csi_cfft_instance_q31 csi_cfft_sR_q31_len16 ; -extern const csi_cfft_instance_q31 csi_cfft_sR_q31_len32 ; -extern const csi_cfft_instance_q31 csi_cfft_sR_q31_len64 ; -extern const csi_cfft_instance_q31 csi_cfft_sR_q31_len128 ; -extern const csi_cfft_instance_q31 csi_cfft_sR_q31_len256 ; -extern const csi_cfft_instance_q31 csi_cfft_sR_q31_len512 ; -extern const csi_cfft_instance_q31 csi_cfft_sR_q31_len1024 ; -extern const csi_cfft_instance_q31 csi_cfft_sR_q31_len2048 ; -extern const csi_cfft_instance_q31 csi_cfft_sR_q31_len4096 ; -extern const csi_cfft_instance_q15 csi_cfft_sR_q15_len16 ; -extern const csi_cfft_instance_q15 csi_cfft_sR_q15_len32 ; -extern const csi_cfft_instance_q15 csi_cfft_sR_q15_len64 ; -extern const csi_cfft_instance_q15 csi_cfft_sR_q15_len128 ; -extern const csi_cfft_instance_q15 csi_cfft_sR_q15_len256 ; -extern const csi_cfft_instance_q15 csi_cfft_sR_q15_len512 ; -extern const csi_cfft_instance_q15 csi_cfft_sR_q15_len1024 ; -extern const csi_cfft_instance_q15 csi_cfft_sR_q15_len2048 ; -extern const csi_cfft_instance_q15 csi_cfft_sR_q15_len4096 ; -extern const csi_rfft_fast_instance_f32 csi_rfft_sR_f32_len32 ; -extern const csi_rfft_fast_instance_f32 csi_rfft_sR_f32_len64 ; -extern const csi_rfft_fast_instance_f32 csi_rfft_sR_f32_len128 ; -extern const csi_rfft_fast_instance_f32 csi_rfft_sR_f32_len256 ; -extern const csi_rfft_fast_instance_f32 csi_rfft_sR_f32_len512 ; -extern const csi_rfft_fast_instance_f32 csi_rfft_sR_f32_len1024 ; -extern const csi_rfft_fast_instance_f32 csi_rfft_sR_f32_len2048 ; -extern const csi_rfft_fast_instance_f32 csi_rfft_sR_f32_len4096 ; -extern const csi_rfft_fast_instance_f32 csi_rfft_sR_f32_len8192 ; -extern const csi_rfft_instance_q31 csi_rfft_sR_q31_len32 ; -extern const csi_rfft_instance_q31 csi_rfft_sR_q31_len64 ; -extern const csi_rfft_instance_q31 csi_rfft_sR_q31_len128 ; -extern const csi_rfft_instance_q31 csi_rfft_sR_q31_len256 ; -extern const csi_rfft_instance_q31 csi_rfft_sR_q31_len512 ; -extern const csi_rfft_instance_q31 csi_rfft_sR_q31_len1024 ; -extern const csi_rfft_instance_q31 csi_rfft_sR_q31_len2048 ; -extern const csi_rfft_instance_q31 csi_rfft_sR_q31_len4096 ; -extern const csi_rfft_instance_q31 csi_rfft_sR_q31_len8192 ; -extern const csi_rfft_instance_q15 csi_rfft_sR_q15_len32 ; -extern const csi_rfft_instance_q15 csi_rfft_sR_q15_len64 ; -extern const csi_rfft_instance_q15 csi_rfft_sR_q15_len128 ; -extern const csi_rfft_instance_q15 csi_rfft_sR_q15_len256 ; -extern const csi_rfft_instance_q15 csi_rfft_sR_q15_len512 ; -extern const csi_rfft_instance_q15 csi_rfft_sR_q15_len1024 ; -extern const csi_rfft_instance_q15 csi_rfft_sR_q15_len2048 ; -extern const csi_rfft_instance_q15 csi_rfft_sR_q15_len4096 ; -extern const csi_rfft_instance_q15 csi_rfft_sR_q15_len8192 ; -extern const csi_rfft_instance_f32 csi_inv_rfft_sR_f32_len32; -extern const csi_rfft_instance_f32 csi_inv_rfft_sR_f32_len64; -extern const csi_rfft_instance_f32 csi_inv_rfft_sR_f32_len128; -extern const csi_rfft_instance_f32 csi_inv_rfft_sR_f32_len256; -extern const csi_rfft_instance_f32 csi_inv_rfft_sR_f32_len512; -extern const csi_rfft_instance_f32 csi_inv_rfft_sR_f32_len1024; -extern const csi_rfft_instance_f32 csi_inv_rfft_sR_f32_len2048; -extern const csi_rfft_instance_f32 csi_inv_rfft_sR_f32_len4096; -extern const csi_rfft_instance_f32 csi_inv_rfft_sR_f32_len8192; -extern const csi_rfft_instance_q31 csi_inv_rfft_sR_q31_len32; -extern const csi_rfft_instance_q31 csi_inv_rfft_sR_q31_len64; -extern const csi_rfft_instance_q31 csi_inv_rfft_sR_q31_len128; -extern const csi_rfft_instance_q31 csi_inv_rfft_sR_q31_len256; -extern const csi_rfft_instance_q31 csi_inv_rfft_sR_q31_len512; -extern const csi_rfft_instance_q31 csi_inv_rfft_sR_q31_len1024; -extern const csi_rfft_instance_q31 csi_inv_rfft_sR_q31_len2048; -extern const csi_rfft_instance_q31 csi_inv_rfft_sR_q31_len4096; -extern const csi_rfft_instance_q31 csi_inv_rfft_sR_q31_len8192; -extern const csi_rfft_instance_q15 csi_inv_rfft_sR_q15_len32; -extern const csi_rfft_instance_q15 csi_inv_rfft_sR_q15_len64; -extern const csi_rfft_instance_q15 csi_inv_rfft_sR_q15_len128; -extern const csi_rfft_instance_q15 csi_inv_rfft_sR_q15_len256; -extern const csi_rfft_instance_q15 csi_inv_rfft_sR_q15_len512; -extern const csi_rfft_instance_q15 csi_inv_rfft_sR_q15_len1024; -extern const csi_rfft_instance_q15 csi_inv_rfft_sR_q15_len2048; -extern const csi_rfft_instance_q15 csi_inv_rfft_sR_q15_len4096; -extern const csi_rfft_instance_q15 csi_inv_rfft_sR_q15_len8192; -extern const csi_dct4_instance_q31 csi_dct4_sR_q31_len128; -extern const csi_dct4_instance_q31 csi_dct4_sR_q31_len512; -extern const csi_dct4_instance_q31 csi_dct4_sR_q31_len2048; -extern const csi_dct4_instance_q31 csi_dct4_sR_q31_len8192; -extern const csi_dct4_instance_q15 csi_dct4_sR_q15_len128; -extern const csi_dct4_instance_q15 csi_dct4_sR_q15_len512; -extern const csi_dct4_instance_q15 csi_dct4_sR_q15_len2048; -extern const csi_dct4_instance_q15 csi_dct4_sR_q15_len8192; -extern const csi_dct4_instance_f32 csi_dct4_sR_f32_len128; -extern const csi_dct4_instance_f32 csi_dct4_sR_f32_len512; -extern const csi_dct4_instance_f32 csi_dct4_sR_f32_len2048; -extern const csi_dct4_instance_f32 csi_dct4_sR_f32_len8192; - -#endif diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csi_instance.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csi_instance.h deleted file mode 100644 index a1aa7131..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csi_instance.h +++ /dev/null @@ -1,1879 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file csi_instance.h - * @brief Some common define - * @version V1.0 - * @date Feb. 2020 - ******************************************************************************/ - - -#ifndef _CSI_INSTANCE_H -#define _CSI_INSTANCE_H - -#ifdef __cplusplus -extern "C" -{ -#endif - - -#include <string.h> -#include <math.h> -#include <float.h> -#include <limits.h> -#include <unistd.h> -#ifndef __CK860__ -#include "csi_core.h" -#else -#include <stdint.h> -#endif - -#define LOW_OPTIMIZATION_ENTER -#define LOW_OPTIMIZATION_EXIT - -#define F64_MAX ((float64_t)DBL_MAX) -#define F32_MAX ((float32_t)FLT_MAX) - -#define F64_MIN (-DBL_MAX) -#define F32_MIN (-FLT_MAX) - -#define F64_ABSMAX ((float64_t)DBL_MAX) -#define F32_ABSMAX ((float32_t)FLT_MAX) - -#define F64_ABSMIN ((float64_t)0.0) -#define F32_ABSMIN ((float32_t)0.0) - -#define Q31_MAX ((q31_t)(0x7FFFFFFFL)) -#define Q15_MAX ((q15_t)(0x7FFF)) -#define Q7_MAX ((q7_t)(0x7F)) -#define Q31_MIN ((q31_t)(0x80000000L)) -#define Q15_MIN ((q15_t)(0x8000)) -#define Q7_MIN ((q7_t)(0x80)) - -#define Q31_ABSMAX ((q31_t)(0x7FFFFFFFL)) -#define Q15_ABSMAX ((q15_t)(0x7FFF)) -#define Q7_ABSMAX ((q7_t)(0x7F)) -#define Q31_ABSMIN ((q31_t)0) -#define Q15_ABSMIN ((q15_t)0) -#define Q7_ABSMIN ((q7_t)0) - -/** - * @brief Macros required for reciprocal calculation in Normalized LMS - */ - -#define DELTA_Q31 ((q31_t)(0x100)) -#define DELTA_Q15 ((q15_t)0x5) -#define INDEX_MASK 0x0000003F -#ifndef PI -#define PI 3.14159265358979f -#endif - -#ifndef UNALIGNED_SUPPORT_DISABLE - #define ALIGN4 -#else - #define ALIGN4 __attribute__((aligned(4))) -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - -/** - * @brief Macros required for SINE and COSINE Fast math approximations - */ - -#define FAST_MATH_TABLE_SIZE 512 -#define FAST_MATH_Q31_SHIFT (32 - 10) -#define FAST_MATH_Q15_SHIFT (16 - 10) -#define CONTROLLER_Q31_SHIFT (32 - 9) -#define TABLE_SPACING_Q31 0x400000 -#define TABLE_SPACING_Q15 0x80 - -#define __STATIC_FORCEINLINE static inline __attribute__((unused)) -#define CSI_NEWTON_SQRTF -#ifdef __CK860__ -#define __STATIC_INLINE static inline __attribute__((unused)) - -#define __ALWAYS_STATIC_INLINE __attribute__((always_inline)) static inline - -#endif - - -/** - * @brief Macros required for SINE and COSINE Controller functions - */ -/* 1.31(q31) Fixed value of 2/360 */ -/* -1 to +1 is divided into 360 values so total spacing is (2/360) */ -#define INPUT_SPACING 0xB60B61 - -/** - * @brief Macros for complex numbers - */ - -/* Dimension C vector space */ -#define CMPLX_DIM 2 - -/** - * @brief Error status returned by some functions in the library. - */ - -typedef enum { - CSI_MATH_SUCCESS = 0, /**< No error */ - CSI_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ - CSI_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ - CSI_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation */ - CSI_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ - CSI_MATH_SINGULAR = -5, /**< Input matrix is singular and cannot be inverted */ - CSI_MATH_TEST_FAILURE = -6 /**< Test Failed */ -} csi_status; - -/** - * @brief 8-bit fractional data type in 1.7 format. - */ -typedef int8_t q7_t; - -/** - * @brief 16-bit fractional data type in 1.15 format. - */ -typedef int16_t q15_t; - -/** - * @brief 32-bit fractional data type in 1.31 format. - */ -typedef int32_t q31_t; - -/** - * @brief 64-bit fractional data type in 1.63 format. - */ -typedef int64_t q63_t; - -/** - * @brief 32-bit floating-point type definition. - */ -typedef float float32_t; - -/** - * @brief 64-bit floating-point type definition. - */ -typedef double float64_t; - -/** - @brief definition to read/write two 16 bit values. - @deprecated - */ -#define __SIMD32_TYPE int32_t -#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) -#define __SIMD32_CONST(addr) ( (__SIMD32_TYPE * ) (addr)) -#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE * ) (addr)) -#define __SIMD64(addr) (*( int64_t **) & (addr)) - -#define STEP(x) (x) <= 0 ? 0 : 1 -#define SQ(x) ((x) * (x)) - -__ALWAYS_STATIC_INLINE int32_t __SSAT_31(int32_t x) -{ - int32_t res = x; - if (x > 0x3fffffff) { - res = 0x3fffffff; - } else if (x < -1073741824) { - res = -1073741824; - } - - return res; -} - -__ALWAYS_STATIC_INLINE int32_t __SSAT_16(int32_t x) -{ - int32_t res = x; - if (x > 0x7fff) { - res = 0x7fff; - } else if (x < -32768) { - res = -32768; - } - - return res; -} - -__ALWAYS_STATIC_INLINE int32_t __SSAT_8(int32_t x) -{ - int32_t res = x; - if (x > 0x7f) { - res = 0x7f; - } else if (x < -128) { - res = -128; - } - - return res; -} - -/** - @brief Read 2 Q15 from Q15 pointer. - @param[in] pQ15 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q15x2 ( - q15_t * pQ15) -{ - q31_t val; - memcpy (&val, pQ15, 4); - return (val); -} - -/** - @brief Read 2 Q15 from Q15 pointer and increment pointer afterwards. - @param[in] pQ15 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q15x2_ia ( - q15_t ** pQ15) -{ - q31_t val; - memcpy (&val, *pQ15, 4); - *pQ15 += 2; - return (val); -} - -/** - @brief Read 2 Q15 from Q15 pointer and decrement pointer afterwards. - @param[in] pQ15 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q15x2_da ( - q15_t ** pQ15) -{ - q31_t val; - memcpy (&val, *pQ15, 4); - *pQ15 -= 2; - return (val); -} - -/** - @brief Write 2 Q15 to Q15 pointer and increment pointer afterwards. - @param[in] pQ15 points to input value - @param[in] value Q31 value - @return none - */ -__STATIC_FORCEINLINE void write_q15x2_ia ( - q15_t ** pQ15, - q31_t value) -{ - q31_t val = value; - memcpy (*pQ15, &val, 4); - *pQ15 += 2; -} - -/** - @brief Write 2 Q15 to Q15 pointer. - @param[in] pQ15 points to input value - @param[in] value Q31 value - @return none - */ -__STATIC_FORCEINLINE void write_q15x2 ( - q15_t * pQ15, - q31_t value) -{ - q31_t val = value; - memcpy (pQ15, &val, 4); -} - - -/** - @brief Read 4 Q7 from Q7 pointer and increment pointer afterwards. - @param[in] pQ7 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q7x4_ia ( - q7_t ** pQ7) -{ - q31_t val; - memcpy (&val, *pQ7, 4); - *pQ7 += 4; - return (val); -} - -/** - @brief Read 4 Q7 from Q7 pointer and decrement pointer afterwards. - @param[in] pQ7 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q7x4_da ( - q7_t ** pQ7) -{ - q31_t val; - memcpy (&val, *pQ7, 4); - *pQ7 -= 4; - return (val); -} - -/** - @brief Write 4 Q7 to Q7 pointer and increment pointer afterwards. - @param[in] pQ7 points to input value - @param[in] value Q31 value - @return none - */ -__STATIC_FORCEINLINE void write_q7x4_ia ( - q7_t ** pQ7, - q31_t value) -{ - q31_t val = value; - memcpy (*pQ7, &val, 4); - *pQ7 += 4; -} - -#ifdef __CK860__ -__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t data) -{ - if (data == 0U) { - return 32U; - } - - uint32_t count = 0U; - uint32_t mask = 0x80000000U; - - while ((data & mask) == 0U) { - count += 1U; - mask = mask >> 1U; - } - - return count; -} - -__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) -{ - if ((sat >= 1U) && (sat <= 32U)) { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - - if (val > max) { - return max; - - } else if (val < min) { - return min; - } - } - - return val; -} - -__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) -{ - if (sat <= 31U) { - const uint32_t max = ((1U << sat) - 1U); - - if (val > (int32_t)max) { - return max; - - } else if (val < 0) { - return 0U; - } - } - - return (uint32_t)val; -} -#endif -/** - * @brief definition to pack two 16 bit values. - */ -#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ - (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) -#define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ - (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) - - -/** -* @brief definition to pack four 8 bit values. -*/ -#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) - -/** - * @brief Clips Q63 to Q31 values. - */ -__STATIC_FORCEINLINE q31_t clip_q63_to_q31( - q63_t x) -{ - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; -} - -/** - * @brief Clips Q63 to Q15 values. - */ -__STATIC_FORCEINLINE q15_t clip_q63_to_q15( - q63_t x) -{ - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); -} - -/** - * @brief Clips Q31 to Q7 values. - */ -__STATIC_FORCEINLINE q7_t clip_q31_to_q7( - q31_t x) -{ - return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? - ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; -} - -/** - * @brief Clips Q31 to Q15 values. - */ -__STATIC_FORCEINLINE q15_t clip_q31_to_q15( - q31_t x) -{ - return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? - ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; -} - -/** - * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. - */ -__STATIC_FORCEINLINE q63_t mult32x64( - q63_t x, - q31_t y) -{ - return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + - (((q63_t) (x >> 32) * y) ) ); -} - -/** - * @brief Integer exponentiation - * @param[in] x value - * @param[in] nb integer exponent >= 1 - * @return x^nb - * - */ -__STATIC_INLINE float32_t csi_exponent_f32(float32_t x, int32_t nb) -{ - float32_t r = x; - nb --; - - while(nb > 0) { - r = r * x; - nb--; - } - - return(r); -} - -/** - * @brief 64-bit to 32-bit unsigned normalization - * @param[in] in is input unsigned long long value - * @param[out] normalized is the 32-bit normalized value - * @param[out] norm is norm scale - */ -__STATIC_INLINE void csi_norm_64_to_32u(uint64_t in, int32_t * normalized, int32_t *norm) -{ - int32_t n1; - int32_t hi = (int32_t) (in >> 32); - int32_t lo = (int32_t) ((in << 32) >> 32); - n1 = __CLZ(hi) - 32; - - if (!n1) { - /* - * input fits in 32-bit - */ - n1 = __CLZ(lo); - - if (!n1) { - /* - * MSB set, need to scale down by 1 - */ - *norm = -1; - *normalized = (((uint32_t) lo) >> 1); - - } else { - if (n1 == 32) { - /* - * input is zero - */ - *norm = 0; - *normalized = 0; - - } else { - /* - * 32-bit normalization - */ - *norm = n1 - 1; - *normalized = lo << *norm; - } - } - - } else { - /* - * input fits in 64-bit - */ - n1 = 1 - n1; - *norm = -n1; - /* - * 64 bit normalization - */ - *normalized = (((uint32_t) lo) >> n1) | (hi << (32 - n1)); - } -} - -__STATIC_INLINE q31_t csi_div_q63_to_q31(q63_t num, q31_t den) -{ - q31_t result; - uint64_t absNum; - int32_t normalized; - int32_t norm; - /* - * if sum fits in 32bits - * avoid costly 64-bit division - */ - absNum = num > 0 ? num : -num; - csi_norm_64_to_32u(absNum, &normalized, &norm); - - if (norm > 0) - /* - * 32-bit division - */ - result = (q31_t) num / den; - - else - /* - * 64-bit division - */ - result = (q31_t) (num / den); - - return result; -} - -/* - * @brief C custom defined intrinsic functions - */ -#ifdef __CK860__ -/* - * @brief C custom defined QADD8 - */ -__STATIC_FORCEINLINE uint32_t __QADD8( - uint32_t x, - uint32_t y) -{ - q31_t r, s, t, u; - r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; - s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; - t = __SSAT(((((q31_t)x << 8) >> 24) + (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; - u = __SSAT(((((q31_t)x ) >> 24) + (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); -} - - -/* - * @brief C custom defined QSUB8 - */ -__STATIC_FORCEINLINE uint32_t __QSUB8( - uint32_t x, - uint32_t y) -{ - q31_t r, s, t, u; - r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; - s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; - t = __SSAT(((((q31_t)x << 8) >> 24) - (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; - u = __SSAT(((((q31_t)x ) >> 24) - (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); -} - - -/* - * @brief C custom defined QADD16 - */ -__STATIC_FORCEINLINE uint32_t __QADD16( - uint32_t x, - uint32_t y) -{ - /* q31_t r, s; without initialisation 'csi_offset_q15 test' fails but 'intrinsic' tests pass! for armCC */ - q31_t r = 0, s = 0; - r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - return ((uint32_t)((s << 16) | (r ))); -} - - -/* - * @brief C custom defined SHADD16 - */ -__STATIC_FORCEINLINE uint32_t __SHADD16( - uint32_t x, - uint32_t y) -{ - q31_t r, s; - r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - return ((uint32_t)((s << 16) | (r ))); -} - - -/* - * @brief C custom defined QSUB16 - */ -__STATIC_FORCEINLINE uint32_t __QSUB16( - uint32_t x, - uint32_t y) -{ - q31_t r, s; - r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - return ((uint32_t)((s << 16) | (r ))); -} - - -/* - * @brief C custom defined SHSUB16 - */ -__STATIC_FORCEINLINE uint32_t __SHSUB16( - uint32_t x, - uint32_t y) -{ - q31_t r, s; - r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - return ((uint32_t)((s << 16) | (r ))); -} - - -/* - * @brief C custom defined QASX - */ -__STATIC_FORCEINLINE uint32_t __QASX( - uint32_t x, - uint32_t y) -{ - q31_t r, s; - r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - return ((uint32_t)((s << 16) | (r ))); -} - - -/* - * @brief C custom defined SHASX - */ -__STATIC_FORCEINLINE uint32_t __SHASX( - uint32_t x, - uint32_t y) -{ - q31_t r, s; - r = (((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - return ((uint32_t)((s << 16) | (r ))); -} - - -/* - * @brief C custom defined QSAX - */ -__STATIC_FORCEINLINE uint32_t __QSAX( - uint32_t x, - uint32_t y) -{ - q31_t r, s; - r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - return ((uint32_t)((s << 16) | (r ))); -} - - -/* - * @brief C custom defined SHSAX - */ -__STATIC_FORCEINLINE uint32_t __SHSAX( - uint32_t x, - uint32_t y) -{ - q31_t r, s; - r = (((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - return ((uint32_t)((s << 16) | (r ))); -} - - -/* - * @brief C custom defined SMUSDX - */ -__STATIC_FORCEINLINE uint32_t __SMUSDX( - uint32_t x, - uint32_t y) -{ - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); -} - -/* - * @brief C custom defined SMUADX - */ -__STATIC_FORCEINLINE uint32_t __SMUADX( - uint32_t x, - uint32_t y) -{ - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); -} - - -/* - * @brief C custom defined QADD - */ -__STATIC_FORCEINLINE int32_t __QADD( - int32_t x, - int32_t y) -{ - return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y))); -} - - -/* - * @brief C custom defined QSUB - */ -__STATIC_FORCEINLINE int32_t __QSUB( - int32_t x, - int32_t y) -{ - return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y))); -} - - -/* - * @brief C custom defined SMLAD - */ -__STATIC_FORCEINLINE uint32_t __SMLAD( - uint32_t x, - uint32_t y, - uint32_t sum) -{ - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + - ( ((q31_t)sum ) ) )); -} - - -/* - * @brief C custom defined SMLADX - */ -__STATIC_FORCEINLINE uint32_t __SMLADX( - uint32_t x, - uint32_t y, - uint32_t sum) -{ - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q31_t)sum ) ) )); -} - - -/* - * @brief C custom defined SMLSDX - */ -__STATIC_FORCEINLINE uint32_t __SMLSDX( - uint32_t x, - uint32_t y, - uint32_t sum) -{ - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q31_t)sum ) ) )); -} - - -/* - * @brief C custom defined SMLALD - */ -__STATIC_FORCEINLINE uint64_t __SMLALD( - uint32_t x, - uint32_t y, - uint64_t sum) -{ - /* return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */ - return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + - ( ((q63_t)sum ) ) )); -} - - -/* - * @brief C custom defined SMLALDX - */ -__STATIC_FORCEINLINE uint64_t __SMLALDX( - uint32_t x, - uint32_t y, - uint64_t sum) -{ - /* return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */ - return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q63_t)sum ) ) )); -} - - -/* - * @brief C custom defined SMUAD - */ -__STATIC_FORCEINLINE uint32_t __SMUAD( - uint32_t x, - uint32_t y) -{ - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); -} - - -/* - * @brief C custom defined SMUSD - */ -__STATIC_FORCEINLINE uint32_t __SMUSD( - uint32_t x, - uint32_t y) -{ - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); -} - - -/* - * @brief C custom defined SXTB16 - */ -__STATIC_FORCEINLINE uint32_t __SXTB16( - uint32_t x) -{ - return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) | - ((((q31_t)x << 8) >> 8) & (q31_t)0xFFFF0000) )); -} -/* - * @brief C custom defined SMMLA - */ -__STATIC_FORCEINLINE int32_t __SMMLA( - int32_t x, - int32_t y, - int32_t sum) -{ - return (sum + (int32_t) (((int64_t) x * y) >> 32)); -} -#endif -/** - * @brief Instance structure for the Q7 FIR filter. - */ -typedef struct { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ -} csi_fir_instance_q7; - -/** - * @brief Instance structure for the Q15 FIR filter. - */ -typedef struct { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ -} csi_fir_instance_q15; - -/** - * @brief Instance structure for the Q31 FIR filter. - */ -typedef struct { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ -} csi_fir_instance_q31; - -/** - * @brief Instance structure for the floating-point FIR filter. - */ -typedef struct { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ -} csi_fir_instance_f32; - -/** - * @brief Instance structure for the Q15 Biquad cascade filter. - */ -typedef struct { - int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ -} csi_biquad_casd_df1_inst_q15; - -/** - * @brief Instance structure for the Q31 Biquad cascade filter. - */ -typedef struct { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ -} csi_biquad_casd_df1_inst_q31; - -/** - * @brief Instance structure for the floating-point Biquad cascade filter. - */ -typedef struct { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ -} csi_biquad_casd_df1_inst_f32; - -/** - * @brief Instance structure for the floating-point matrix structure. - */ -typedef struct { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float32_t *pData; /**< points to the data of the matrix. */ -} csi_matrix_instance_f32; - - -/** - * @brief Instance structure for the floating-point matrix structure. - */ -typedef struct { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float64_t *pData; /**< points to the data of the matrix. */ -} csi_matrix_instance_f64; - -/** - * @brief Instance structure for the Q15 matrix structure. - */ -typedef struct { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q15_t *pData; /**< points to the data of the matrix. */ -} csi_matrix_instance_q15; - -/** - * @brief Instance structure for the Q31 matrix structure. - */ -typedef struct { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q31_t *pData; /**< points to the data of the matrix. */ -} csi_matrix_instance_q31; - -/** - * @brief Instance structure for the Q15 PID Control. - */ -typedef struct { - q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - q15_t A1; - q15_t A2; - q15_t state[3]; /**< The state array of length 3. */ - q15_t Kp; /**< The proportional gain. */ - q15_t Ki; /**< The integral gain. */ - q15_t Kd; /**< The derivative gain. */ -} csi_pid_instance_q15; - -/** - * @brief Instance structure for the Q31 PID Control. - */ -typedef struct { - q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - q31_t A2; /**< The derived gain, A2 = Kd . */ - q31_t state[3]; /**< The state array of length 3. */ - q31_t Kp; /**< The proportional gain. */ - q31_t Ki; /**< The integral gain. */ - q31_t Kd; /**< The derivative gain. */ -} csi_pid_instance_q31; - -/** - * @brief Instance structure for the floating-point PID Control. - */ -typedef struct { - float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - float32_t A2; /**< The derived gain, A2 = Kd . */ - float32_t state[3]; /**< The state array of length 3. */ - float32_t Kp; /**< The proportional gain. */ - float32_t Ki; /**< The integral gain. */ - float32_t Kd; /**< The derivative gain. */ -} csi_pid_instance_f32; - -/** - * @brief Instance structure for the floating-point Linear Interpolate function. - */ -typedef struct { - uint32_t nValues; /**< nValues */ - float32_t x1; /**< x1 */ - float32_t xSpacing; /**< xSpacing */ - float32_t *pYData; /**< pointer to the table of Y values */ -} csi_linear_interp_instance_f32; - -/** - * @brief Instance structure for the floating-point bilinear interpolation function. - */ -typedef struct { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - float32_t *pData; /**< points to the data table. */ -} csi_bilinear_interp_instance_f32; - -/** -* @brief Instance structure for the Q31 bilinear interpolation function. -*/ -typedef struct { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q31_t *pData; /**< points to the data table. */ -} csi_bilinear_interp_instance_q31; - -/** -* @brief Instance structure for the Q15 bilinear interpolation function. -*/ -typedef struct { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q15_t *pData; /**< points to the data table. */ -} csi_bilinear_interp_instance_q15; - -/** -* @brief Instance structure for the Q15 bilinear interpolation function. -*/ -typedef struct { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q7_t *pData; /**< points to the data table. */ -} csi_bilinear_interp_instance_q7; - -/** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ -typedef struct { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ -} csi_cfft_radix2_instance_q15; - -/** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ -typedef struct { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q15_t *pTwiddle; /**< points to the twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ -} csi_cfft_radix4_instance_q15; - -/** - * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. - */ -typedef struct { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ -} csi_cfft_radix2_instance_q31; - - -/** - * @brief Instance structure for the Q31 CFFT/CIFFT function. - */ -typedef struct { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q31_t *pTwiddle; /**< points to the twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ -} csi_cfft_radix4_instance_q31; - -/** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ -typedef struct { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ -} csi_cfft_radix2_instance_f32; - -/** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ -typedef struct { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ -} csi_cfft_radix4_instance_f32; - -/** - * @brief Instance structure for the fixed-point CFFT/CIFFT function. - */ -typedef struct { - uint16_t fftLen; /**< length of the FFT. */ - const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ -} csi_cfft_instance_q15; - -/** - * @brief Instance structure for the fixed-point CFFT/CIFFT function. - */ -typedef struct { - uint16_t fftLen; /**< length of the FFT. */ - const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ -} csi_cfft_instance_q31; - - -/** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ -typedef struct { - uint16_t fftLen; /**< length of the FFT. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ -} csi_cfft_instance_f32; - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - q31_t *pTwiddleAReal; /**< points to the A real twiddle factor table. */ - q31_t *pTwiddleBReal; /**< points to the B real twiddle factor table. */ - const csi_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } csi_rfft_fast_instance_q31; - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - q15_t *pTwiddleAReal; /**< points to the A real twiddle factor table. */ - q15_t *pTwiddleBReal; /**< points to the B real twiddle factor table. */ - const csi_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } csi_rfft_fast_instance_q15; - -/** - * @brief Instance structure for the Q15 RFFT/RIFFT function. - */ -typedef struct { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ -#if (!defined __riscv_xthead) && (defined __riscv) - q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ -#endif - const csi_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ -} csi_rfft_instance_q15; - - -/** - * @brief Instance structure for the Q31 RFFT/RIFFT function. - */ -typedef struct { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ -#if (!defined __riscv_xthead) && (defined __riscv) - q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ -#endif - const csi_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ -} csi_rfft_instance_q31; - - -/** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ -typedef struct { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint16_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - csi_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ -} csi_rfft_instance_f32; - -/** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ -typedef struct { - csi_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ - uint16_t fftLenRFFT; /**< length of the real sequence */ - const float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ -} csi_rfft_fast_instance_f32 ; - -/** - * @brief Instance structure for the floating-point DCT4/IDCT4 function. - */ -typedef struct { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - float32_t normalize; /**< normalizing factor. */ - const float32_t *pTwiddle; /**< points to the twiddle factor table. */ - const float32_t *pCosFactor; /**< points to the cosFactor table. */ - csi_rfft_fast_instance_f32 *pRfft; /**< points to the real FFT instance. */ - csi_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ -} csi_dct4_instance_f32; - - -/** - * @brief Instance structure for the Q31 DCT4/IDCT4 function. - */ -typedef struct { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q31_t normalize; /**< normalizing factor. */ - const q31_t *pTwiddle; /**< points to the twiddle factor table. */ - const q31_t *pCosFactor; /**< points to the cosFactor table. */ - csi_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ - csi_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ -} csi_dct4_instance_q31; - - -/** - * @brief Instance structure for the Q15 DCT4/IDCT4 function. - */ -typedef struct { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q15_t normalize; /**< normalizing factor. */ - const q15_t *pTwiddle; /**< points to the twiddle factor table. */ - const q15_t *pCosFactor; /**< points to the cosFactor table. */ - csi_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ - csi_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ -} csi_dct4_instance_q15; - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q15_t normalize; /**< normalizing factor. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - q15_t *pCosFactor; /**< points to the cosFactor table. */ - csi_rfft_fast_instance_q15 *pRfft; /**< points to the real FFT instance. */ - csi_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } csi_dct4_fast_instance_q15; - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q31_t normalize; /**< normalizing factor. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - q31_t *pCosFactor; /**< points to the cosFactor table. */ - csi_rfft_fast_instance_q31 *pRfft; /**< points to the real FFT instance. */ - csi_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } csi_dct4_fast_instance_q31; - - csi_status csi_dct4_init_q31( - csi_dct4_instance_q31 * S, - csi_rfft_instance_q31 * S_RFFT, - csi_cfft_radix4_instance_q31 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q31_t normalize); - - void csi_dct4_q31( - const csi_dct4_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - - void csi_dct4_fast_q31( - const csi_dct4_fast_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - - -/** - * @brief Instance structure for the Q15 FIR decimator. - */ -typedef struct { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ -} csi_fir_decimate_instance_q15; - -/** - * @brief Instance structure for the Q31 FIR decimator. - */ -typedef struct { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ -} csi_fir_decimate_instance_q31; - -/** - @brief Instance structure for floating-point FIR decimator. - */ -typedef struct { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ -} csi_fir_decimate_instance_f32; - -/** - * @brief Instance structure for the Q15 FIR interpolator. - */ -typedef struct { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ -} csi_fir_interpolate_instance_q15; - -/** - * @brief Instance structure for the Q31 FIR interpolator. - */ -typedef struct { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ -} csi_fir_interpolate_instance_q31; - -/** - * @brief Instance structure for the floating-point FIR interpolator. - */ -typedef struct { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ -} csi_fir_interpolate_instance_f32; - - -/** - * @brief Instance structure for the high precision Q31 Biquad cascade filter. - */ -typedef struct { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - const q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ -} csi_biquad_cas_df1_32x64_ins_q31; - -/** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ -typedef struct { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ -} csi_biquad_cascade_df2T_instance_f32; - -/** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ -typedef struct { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ -} csi_biquad_cascade_stereo_df2T_instance_f32; - -/** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ -typedef struct { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float64_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - float64_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ -} csi_biquad_cascade_df2T_instance_f64; - -/** - * @brief Instance structure for the Q15 FIR lattice filter. - */ -typedef struct { - uint16_t numStages; /**< number of filter stages. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ -} csi_fir_lattice_instance_q15; - -/** - * @brief Instance structure for the Q31 FIR lattice filter. - */ -typedef struct { - uint16_t numStages; /**< number of filter stages. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ -} csi_fir_lattice_instance_q31; - -/** - * @brief Instance structure for the floating-point FIR lattice filter. - */ -typedef struct { - uint16_t numStages; /**< number of filter stages. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ -} csi_fir_lattice_instance_f32; - - -/** - * @brief Instance structure for the Q15 IIR lattice filter. - */ -typedef struct { - uint16_t numStages; /**< number of stages in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ -} csi_iir_lattice_instance_q15; - -/** - * @brief Instance structure for the Q31 IIR lattice filter. - */ -typedef struct { - uint16_t numStages; /**< number of stages in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ -} csi_iir_lattice_instance_q31; - -/** - * @brief Instance structure for the floating-point IIR lattice filter. - */ -typedef struct { - uint16_t numStages; /**< number of stages in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ -} csi_iir_lattice_instance_f32; - - -/** - * @brief Instance structure for the floating-point LMS filter. - */ -typedef struct { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that controls filter coefficient updates. */ -} csi_lms_instance_f32; - - -/** - * @brief Instance structure for the Q15 LMS filter. - */ -typedef struct { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ -} csi_lms_instance_q15; - - -/** - * @brief Instance structure for the Q31 LMS filter. - */ -typedef struct { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ -} csi_lms_instance_q31; - - -/** - * @brief Instance structure for the floating-point normalized LMS filter. - */ -typedef struct { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that control filter coefficient updates. */ - float32_t energy; /**< saves previous frame energy. */ - float32_t x0; /**< saves previous input sample. */ -} csi_lms_norm_instance_f32; - -/** - * @brief Instance structure for the Q31 normalized LMS filter. - */ -typedef struct { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - const q31_t *recipTable; /**< points to the reciprocal initial value table. */ - q31_t energy; /**< saves previous frame energy. */ - q31_t x0; /**< saves previous input sample. */ -} csi_lms_norm_instance_q31; - - -/** - * @brief Instance structure for the Q15 normalized LMS filter. - */ -typedef struct { - uint16_t numTaps; /**< Number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - const q15_t *recipTable; /**< Points to the reciprocal initial value table. */ - q15_t energy; /**< saves previous frame energy. */ - q15_t x0; /**< saves previous input sample. */ -} csi_lms_norm_instance_q15; - -/** - * @brief Instance structure for the floating-point sparse FIR filter. - */ -typedef struct { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ -} csi_fir_sparse_instance_f32; - -/** - * @brief Instance structure for the Q31 sparse FIR filter. - */ -typedef struct { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ -} csi_fir_sparse_instance_q31; - -/** - * @brief Instance structure for the Q15 sparse FIR filter. - */ -typedef struct { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ -} csi_fir_sparse_instance_q15; - -/** - * @brief Instance structure for the Q7 sparse FIR filter. - */ -typedef struct { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ -} csi_fir_sparse_instance_q7; - - -/** -* @brief Struct for specifying SVM Kernel -* -*/ -typedef enum { - CSI_ML_KERNEL_LINEAR = 0, - /**< Linear kernel */ - CSI_ML_KERNEL_POLYNOMIAL = 1, - /**< Polynomial kernel */ - CSI_ML_KERNEL_RBF = 2, - /**< Radial Basis Function kernel */ - CSI_ML_KERNEL_SIGMOID = 3 - /**< Sigmoid kernel */ -} csi_ml_kernel_type; - - - -/** - * @brief Instance structure for linear SVM prediction function. - */ -typedef struct { - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ -} csi_svm_linear_instance_f32; - - -/** - * @brief Instance structure for polynomial SVM prediction function. - */ -typedef struct { - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - int32_t degree; /**< Polynomial degree */ - float32_t coef0; /**< Polynomial constant */ - float32_t gamma; /**< Gamma factor */ -} csi_svm_polynomial_instance_f32; - -/** - * @brief Instance structure for rbf SVM prediction function. - */ -typedef struct { - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - float32_t gamma; /**< Gamma factor */ -} csi_svm_rbf_instance_f32; - -/** - * @brief Instance structure for sigmoid SVM prediction function. - */ -typedef struct { - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - float32_t coef0; /**< Independant constant */ - float32_t gamma; /**< Gamma factor */ -} csi_svm_sigmoid_instance_f32; - -/** - * @brief Instance structure for Naive Gaussian Bayesian estimator. - */ -typedef struct { - uint32_t vectorDimension; /**< Dimension of vector space */ - uint32_t numberOfClasses; /**< Number of different classes */ - const float32_t *theta; /**< Mean values for the Gaussians */ - const float32_t *sigma; /**< Variances for the Gaussians */ - const float32_t *classPriors; /**< Class prior probabilities */ - float32_t epsilon; /**< Additive value to variances */ -} csi_gaussian_naive_bayes_instance_f32; - -#ifdef CSI_SIMD -/* SMMLAR */ -__ALWAYS_STATIC_INLINE int32_t multAcc_32x32_keep32_R(int32_t a, int32_t x, int32_t y) -{ - __ASM volatile("mula.s32.rhs %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y) : "0" (a), "1" (x), "2" (y)); - return a; -} - -/* SMMLSR */ -__ALWAYS_STATIC_INLINE int32_t multSub_32x32_keep32_R(int32_t a, int32_t x, int32_t y) -{ - __ASM volatile("muls.s32.rhs %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -/* SMMULR */ -__ALWAYS_STATIC_INLINE int32_t mult_32x32_keep32_R(int32_t x, int32_t y) -{ - int32_t a; - __ASM volatile("mul.s32.rh %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "1" (x), "2" (y)); - return a; -} - -/* SMMLA */ -__ALWAYS_STATIC_INLINE int32_t multAcc_32x32_keep32(int32_t a, int32_t x, int32_t y) -{ - __ASM volatile("mula.s32.hs %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -/* SMMLS */ -__ALWAYS_STATIC_INLINE int32_t multSub_32x32_keep32(int32_t a, int32_t x, int32_t y) -{ - __ASM volatile("muls.s32.hs %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -/* SMMUL */ -__ALWAYS_STATIC_INLINE int32_t mult_32x32_keep32(int32_t x, int32_t y) -{ - int32_t a; - __ASM volatile("mul.s32.h %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int32_t multAcc_16x16_keep32(int32_t a, int16_t x, int16_t y) -{ - __ASM volatile("mulall.s16 %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int64_t multAcc_16x16_keep64(int64_t a, int16_t x, int16_t y) -{ - __ASM volatile("mulall.s16.e %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int64_t mult_32x32_keep64(int32_t x, int32_t y) -{ - int64_t a; - __ASM volatile("mul.s32 %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int64_t multAcc_32x32_keep64(int64_t a, int32_t x, int32_t y) -{ - __ASM volatile("mula.s32 %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int32_t mult_32x32_dext_31(int32_t x, int32_t y) -{ - int64_t tmp1; - int32_t tmp2; - __ASM volatile("mul.s32 %0, %1, %2\n\t" - "dexti %3, %0, %R0, 31" - :"=r" (tmp1), "=r" (x), "=r" (y), "=r" (tmp2): "1" (x), "2" (y)); - return tmp2; -} - -__ALWAYS_STATIC_INLINE int32_t mult_32x32_dext_30(int32_t x, int32_t y) -{ - int64_t tmp1; - int32_t tmp2; - __ASM volatile("mul.s32 %0, %1, %2\n\t" - "dexti %3, %0, %R0, 30" - :"=r" (tmp1), "=r" (x), "=r" (y), "=r" (tmp2): "1" (x), "2" (y)); - return tmp2; -} - -__ALWAYS_STATIC_INLINE int32_t mult_32x32_dext_4(int32_t x, int32_t y) -{ - int64_t tmp1; - int32_t tmp2; - __ASM volatile("mul.s32 %0, %1, %2\n\t" - "dexti %3, %0, %R0, 4" - :"=r" (tmp1), "=r" (x), "=r" (y), "=r" (tmp2): "1" (x), "2" (y)); - return tmp2; -} - -__ALWAYS_STATIC_INLINE int32_t mult_32x32_dext_33(int32_t x, int32_t y) -{ - int64_t tmp1; - int32_t tmp2; - __ASM volatile("mul.s32 %0, %1, %2\n\t" - "asri %3, %R0, 1" - :"=r" (tmp1), "=r" (x), "=r" (y), "=r" (tmp2): "1" (x), "2" (y)); - return tmp2; -} - -__ALWAYS_STATIC_INLINE int32_t dext_31(int64_t x) -{ - int32_t tmp1; - __ASM volatile( - "dexti %0, %1, %R1, 31" - :"=r" (tmp1), "=r" (x) : "1" (x)); - return tmp1; -} - -__ALWAYS_STATIC_INLINE int32_t mult_l16xl16_keep32(int32_t x, int32_t y) -{ - int32_t a; - __ASM volatile("mulll.s16 %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int32_t mult_h16xl16_keep32(int32_t x, int32_t y) -{ - int32_t a; - __ASM volatile("mulhl.s16 %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int32_t mult_h16xh16_keep32(int32_t x, int32_t y) -{ - int32_t a; - __ASM volatile("mulhh.s16 %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "1" (x), "2" (y)); - return a; -} - -#else - -/* SMMLAR */ -#define multAcc_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) - -/* SMMLSR */ -#define multSub_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) - -/* SMMULR */ -#define mult_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) - -/* SMMLA */ -#define multAcc_32x32_keep32(a, x, y) \ - a += (q31_t) (((q63_t) x * y) >> 32) - -/* SMMLS */ -#define multSub_32x32_keep32(a, x, y) \ - a -= (q31_t) (((q63_t) x * y) >> 32) - -/* SMMUL */ -#define mult_32x32_keep32(a, x, y) \ - a = (q31_t) (((q63_t) x * y ) >> 32) -#endif -#ifdef __cplusplus -} -#endif - - -#endif /* _CSI_MATH_H */ - -/** - * - * End of file. - */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csi_math.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csi_math.h deleted file mode 100644 index 24eb063a..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csi_math.h +++ /dev/null @@ -1,5739 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file csi_math.h - * @brief Some common define - * @version V1.0 - * @date Feb. 2020 - ******************************************************************************/ - - -#ifndef _CSI_MATH_H -#define _CSI_MATH_H - -#ifdef __cplusplus -extern "C" -{ -#endif - - -#include <string.h> -#include <math.h> -#include <float.h> -#include <limits.h> -#include <unistd.h> -#include "csi_instance.h" - - -/** - * @brief Processing function for the Q7 FIR filter. - * @param[in] S points to an instance of the Q7 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_fir_q7( - const csi_fir_instance_q7 * S, - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - -/** - * @brief Initialization function for the Q7 FIR filter. - * @param[in,out] S points to an instance of the Q7 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed. - */ -void csi_fir_init_q7( - csi_fir_instance_q7 * S, - uint16_t numTaps, - const q7_t * pCoeffs, - q7_t * pState, - uint32_t blockSize); - -/** - * @brief Processing function for the Q15 FIR filter. - * @param[in] S points to an instance of the Q15 FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_fir_q15( - const csi_fir_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - -/** - * @brief Processing function for the fast Q15 FIR filter (fast version). - * @param[in] S points to an instance of the Q15 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_fir_fast_q15( - const csi_fir_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - -/** - * @brief Initialization function for the Q15 FIR filter. - * @param[in,out] S points to an instance of the Q15 FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return The function returns either - * <code>CSI_MATH_SUCCESS</code> if initialization was successful or - * <code>CSI_MATH_ARGUMENT_ERROR</code> if <code>numTaps</code> is not a supported value. - */ -csi_status csi_fir_init_q15( - csi_fir_instance_q15 * S, - uint16_t numTaps, - const q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - -/** - * @brief Processing function for the Q31 FIR filter. - * @param[in] S points to an instance of the Q31 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_fir_q31( - const csi_fir_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - -/** - * @brief Processing function for the fast Q31 FIR filter (fast version). - * @param[in] S points to an instance of the Q31 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_fir_fast_q31( - const csi_fir_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - -/** - * @brief Initialization function for the Q31 FIR filter. - * @param[in,out] S points to an instance of the Q31 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - */ -void csi_fir_init_q31( - csi_fir_instance_q31 * S, - uint16_t numTaps, - const q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - -/** - * @brief Processing function for the floating-point FIR filter. - * @param[in] S points to an instance of the floating-point FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_fir_f32( - const csi_fir_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - -/** - * @brief Initialization function for the floating-point FIR filter. - * @param[in,out] S points to an instance of the floating-point FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - */ -void csi_fir_init_f32( - csi_fir_instance_f32 * S, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - -/** - * @brief Processing function for the Q15 Biquad cascade filter. - * @param[in] S points to an instance of the Q15 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_biquad_cascade_df1_q15( - const csi_biquad_casd_df1_inst_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - -/** - * @brief Initialization function for the Q15 Biquad cascade filter. - * @param[in,out] S points to an instance of the Q15 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - */ -void csi_biquad_cascade_df1_init_q15( - csi_biquad_casd_df1_inst_q15 * S, - uint8_t numStages, - const q15_t * pCoeffs, - q15_t * pState, - int8_t postShift); - -/** - * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q15 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_biquad_cascade_df1_fast_q15( - const csi_biquad_casd_df1_inst_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - -/** - * @brief Processing function for the Q31 Biquad cascade filter - * @param[in] S points to an instance of the Q31 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_biquad_cascade_df1_q31( - const csi_biquad_casd_df1_inst_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - -/** - * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q31 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_biquad_cascade_df1_fast_q31( - const csi_biquad_casd_df1_inst_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - -/** - * @brief Initialization function for the Q31 Biquad cascade filter. - * @param[in,out] S points to an instance of the Q31 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - */ -void csi_biquad_cascade_df1_init_q31( - csi_biquad_casd_df1_inst_q31 * S, - uint8_t numStages, - const q31_t * pCoeffs, - q31_t * pState, - int8_t postShift); - -/** - * @brief Processing function for the floating-point Biquad cascade filter. - * @param[in] S points to an instance of the floating-point Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_biquad_cascade_df1_f32( - const csi_biquad_casd_df1_inst_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - -/** - * @brief Initialization function for the floating-point Biquad cascade filter. - * @param[in,out] S points to an instance of the floating-point Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ -void csi_biquad_cascade_df1_init_f32( - csi_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pState); - -/** - * @brief Floating-point matrix addition. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_add_f32( - const csi_matrix_instance_f32 * pSrcA, - const csi_matrix_instance_f32 * pSrcB, - csi_matrix_instance_f32 * pDst); - -/** - * @brief Q15 matrix addition. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_add_q15( - const csi_matrix_instance_q15 * pSrcA, - const csi_matrix_instance_q15 * pSrcB, - csi_matrix_instance_q15 * pDst); - -/** - * @brief Q31 matrix addition. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_add_q31( - const csi_matrix_instance_q31 * pSrcA, - const csi_matrix_instance_q31 * pSrcB, - csi_matrix_instance_q31 * pDst); - -/** - * @brief Floating-point, complex, matrix multiplication. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_cmplx_mult_f32( - const csi_matrix_instance_f32 * pSrcA, - const csi_matrix_instance_f32 * pSrcB, - csi_matrix_instance_f32 * pDst); - -/** - * @brief Q15, complex, matrix multiplication. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_cmplx_mult_q15( - const csi_matrix_instance_q15 * pSrcA, - const csi_matrix_instance_q15 * pSrcB, - csi_matrix_instance_q15 * pDst); - -void csi_mult_q15xq31_sht( - q15_t * pSrcA, - q31_t * pSrcB, - uint32_t shiftValue, - uint32_t blockSize); - -/** - * @brief Q31, complex, matrix multiplication. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_cmplx_mult_q31( - const csi_matrix_instance_q31 * pSrcA, - const csi_matrix_instance_q31 * pSrcB, - csi_matrix_instance_q31 * pDst); - -/** - * @brief Floating-point matrix transpose. - * @param[in] pSrc points to the input matrix - * @param[out] pDst points to the output matrix - * @return The function returns either <code>CSI_MATH_SIZE_MISMATCH</code> - * or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_trans_f32( - const csi_matrix_instance_f32 * pSrc, - csi_matrix_instance_f32 * pDst); - -/** - * @brief Q15 matrix transpose. - * @param[in] pSrc points to the input matrix - * @param[out] pDst points to the output matrix - * @return The function returns either <code>CSI_MATH_SIZE_MISMATCH</code> - * or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_trans_q15( - const csi_matrix_instance_q15 * pSrc, - csi_matrix_instance_q15 * pDst); - -/** - * @brief Q31 matrix transpose. - * @param[in] pSrc points to the input matrix - * @param[out] pDst points to the output matrix - * @return The function returns either <code>CSI_MATH_SIZE_MISMATCH</code> - * or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_trans_q31( - const csi_matrix_instance_q31 * pSrc, - csi_matrix_instance_q31 * pDst); - -/** - * @brief Floating-point matrix multiplication - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_mult_f32( - const csi_matrix_instance_f32 * pSrcA, - const csi_matrix_instance_f32 * pSrcB, - csi_matrix_instance_f32 * pDst); - -/** - * @brief Q15 matrix multiplication - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_mult_q15( - const csi_matrix_instance_q15 * pSrcA, - const csi_matrix_instance_q15 * pSrcB, - csi_matrix_instance_q15 * pDst); - - csi_status csi_mat_mult_trans_q15( - const csi_matrix_instance_q15 * pSrcA, - const csi_matrix_instance_q15 * pSrcB, - csi_matrix_instance_q15 * pDst); - -/** - * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @param[in] pState points to the array for storing intermediate results - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_mult_fast_q15( - const csi_matrix_instance_q15 * pSrcA, - const csi_matrix_instance_q15 * pSrcB, - csi_matrix_instance_q15 * pDst); - -/** - * @brief Q31 matrix multiplication - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_mult_q31( - const csi_matrix_instance_q31 * pSrcA, - const csi_matrix_instance_q31 * pSrcB, - csi_matrix_instance_q31 * pDst); - -csi_status csi_mat_mult_trans_q31( - const csi_matrix_instance_q31 * pSrcA, - const csi_matrix_instance_q31 * pSrcB, - csi_matrix_instance_q31 * pDst); - -/** - * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_mult_fast_q31( - const csi_matrix_instance_q31 * pSrcA, - const csi_matrix_instance_q31 * pSrcB, - csi_matrix_instance_q31 * pDst); - -/** - * @brief Floating-point matrix subtraction - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_sub_f32( - const csi_matrix_instance_f32 * pSrcA, - const csi_matrix_instance_f32 * pSrcB, - csi_matrix_instance_f32 * pDst); - -/** - * @brief Q15 matrix subtraction - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_sub_q15( - const csi_matrix_instance_q15 * pSrcA, - const csi_matrix_instance_q15 * pSrcB, - csi_matrix_instance_q15 * pDst); - -/** - * @brief Q31 matrix subtraction - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_sub_q31( - const csi_matrix_instance_q31 * pSrcA, - const csi_matrix_instance_q31 * pSrcB, - csi_matrix_instance_q31 * pDst); - -void csi_sum_q15( - q15_t * pSrcA, - q63_t * pDst, - uint32_t blockSize); - -/** - * @brief Floating-point matrix scaling. - * @param[in] pSrc points to the input matrix - * @param[in] scale scale factor - * @param[out] pDst points to the output matrix - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_scale_f32( - const csi_matrix_instance_f32 * pSrc, - float32_t scale, - csi_matrix_instance_f32 * pDst); - -/** - * @brief Q15 matrix scaling. - * @param[in] pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to output matrix - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_scale_q15( - const csi_matrix_instance_q15 * pSrc, - q15_t scaleFract, - int32_t shift, - csi_matrix_instance_q15 * pDst); - -/** - * @brief Q31 matrix scaling. - * @param[in] pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to output matrix structure - * @return The function returns either - * <code>CSI_MATH_SIZE_MISMATCH</code> or <code>CSI_MATH_SUCCESS</code> based on the outcome of size checking. - */ -csi_status csi_mat_scale_q31( - const csi_matrix_instance_q31 * pSrc, - q31_t scaleFract, - int32_t shift, - csi_matrix_instance_q31 * pDst); - -/** - * @brief Q31 matrix initialization. - * @param[in,out] S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] pData points to the matrix data array. - */ -void csi_mat_init_q31( - csi_matrix_instance_q31 * S, - uint16_t nRows, - uint16_t nColumns, - q31_t * pData); - -/** - * @brief Q15 matrix initialization. - * @param[in,out] S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] pData points to the matrix data array. - */ -void csi_mat_init_q15( - csi_matrix_instance_q15 * S, - uint16_t nRows, - uint16_t nColumns, - q15_t * pData); - -/** - * @brief Floating-point matrix initialization. - * @param[in,out] S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] pData points to the matrix data array. - */ -void csi_mat_init_f32( - csi_matrix_instance_f32 * S, - uint16_t nRows, - uint16_t nColumns, - float32_t * pData); - - -/** - * @brief Initialization function for the floating-point PID Control. - * @param[in,out] S points to an instance of the PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - */ -void csi_pid_init_f32( - csi_pid_instance_f32 * S, - int32_t resetStateFlag); - - -/** - * @brief Reset function for the floating-point PID Control. - * @param[in,out] S is an instance of the floating-point PID Control structure - */ -void csi_pid_reset_f32( - csi_pid_instance_f32 * S); - - -/** - * @brief Initialization function for the Q31 PID Control. - * @param[in,out] S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - */ -void csi_pid_init_q31( - csi_pid_instance_q31 * S, - int32_t resetStateFlag); - - -/** - * @brief Reset function for the Q31 PID Control. - * @param[in,out] S points to an instance of the Q31 PID Control structure - */ - -void csi_pid_reset_q31( - csi_pid_instance_q31 * S); - - -/** - * @brief Initialization function for the Q15 PID Control. - * @param[in,out] S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - */ -void csi_pid_init_q15( - csi_pid_instance_q15 * S, - int32_t resetStateFlag); - - -/** - * @brief Reset function for the Q15 PID Control. - * @param[in,out] S points to an instance of the q15 PID Control structure - */ -void csi_pid_reset_q15( - csi_pid_instance_q15 * S); - -/** - * @brief Q7 vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ -void csi_mult_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Q15 vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ -void csi_mult_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - -void csi_mult_rnd_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Q31 vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ -void csi_mult_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Floating-point vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ -void csi_mult_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - -/* Deprecated */ -csi_status csi_cfft_radix2_init_q15( - csi_cfft_radix2_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ -void csi_cfft_radix2_q15( - const csi_cfft_radix2_instance_q15 * S, - q15_t * pSrc); - - -/* Deprecated */ -csi_status csi_cfft_radix4_init_q15( - csi_cfft_radix4_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ -void csi_cfft_radix4_q15( - const csi_cfft_radix4_instance_q15 * S, - q15_t * pSrc); - -/* Deprecated */ -csi_status csi_cfft_radix2_init_q31( - csi_cfft_radix2_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ -void csi_cfft_radix2_q31( - const csi_cfft_radix2_instance_q31 * S, - q31_t * pSrc); - - -/* Deprecated */ -void csi_cfft_radix4_q31( - const csi_cfft_radix4_instance_q31 * S, - q31_t * pSrc); - -/* Deprecated */ -csi_status csi_cfft_radix4_init_q31( - csi_cfft_radix4_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - -/* Deprecated */ -csi_status csi_cfft_radix2_init_f32( - csi_cfft_radix2_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void csi_cfft_radix2_f32( - const csi_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag, - float32_t onebyfftLen); - - -/* Deprecated */ -csi_status csi_cfft_radix4_init_f32( - csi_cfft_radix4_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void csi_cfft_radix4_f32( - const csi_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag, - float32_t onebyfftLen); - - void csi_cfft_fast_radix4_f32( - const csi_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag, - float32_t onebyfftLen); - - -void csi_cfft_q15( - const csi_cfft_instance_q15 * S, - q15_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -void csi_cfft_fast_q15( - const csi_cfft_instance_q15 * S, - q15_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -void csi_cfft_q31( - const csi_cfft_instance_q31 * S, - q31_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -void csi_cfft_fast_q31( - const csi_cfft_instance_q31 * S, - q31_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - -void csi_cfft_f32( - const csi_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - -csi_status csi_rfft_init_q15( - csi_rfft_instance_q15 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - -void csi_rfft_q15( - const csi_rfft_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst); - -void csi_rfft_fast_q15( - const csi_rfft_fast_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst); - - -csi_status csi_rfft_init_q31( - csi_rfft_instance_q31 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - -void csi_rfft_q31( - const csi_rfft_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst); - -void csi_rfft_fast_q31( - const csi_rfft_fast_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst); - - -csi_status csi_rfft_init_f32( - csi_rfft_instance_f32 * S, - csi_cfft_radix4_instance_f32 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - -void csi_rfft_f32( - const csi_rfft_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst); - - -csi_status csi_rfft_fast_init_f32 ( - csi_rfft_fast_instance_f32 * S, - uint16_t fftLen); - -csi_status csi_rfft_32_fast_init_f32 ( csi_rfft_fast_instance_f32 * S ); - -csi_status csi_rfft_64_fast_init_f32 ( csi_rfft_fast_instance_f32 * S ); - -csi_status csi_rfft_128_fast_init_f32 ( csi_rfft_fast_instance_f32 * S ); - -csi_status csi_rfft_256_fast_init_f32 ( csi_rfft_fast_instance_f32 * S ); - -csi_status csi_rfft_512_fast_init_f32 ( csi_rfft_fast_instance_f32 * S ); - -csi_status csi_rfft_1024_fast_init_f32 ( csi_rfft_fast_instance_f32 * S ); - -csi_status csi_rfft_2048_fast_init_f32 ( csi_rfft_fast_instance_f32 * S ); - -csi_status csi_rfft_4096_fast_init_f32 ( csi_rfft_fast_instance_f32 * S ); - - -void csi_rfft_fast_f32( - csi_rfft_fast_instance_f32 * S, - float32_t * p, float32_t * pOut, - uint8_t ifftFlag); - - -/** - * @brief Initialization function for the floating-point DCT4/IDCT4. - * @param[in,out] S points to an instance of floating-point DCT4/IDCT4 structure. - * @param[in] S_RFFT points to an instance of floating-point RFFT/RIFFT structure. - * @param[in] S_CFFT points to an instance of floating-point CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return csi_status function returns CSI_MATH_SUCCESS if initialization is successful or CSI_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported transform length. - */ -csi_status csi_dct4_init_f32( - csi_dct4_instance_f32 * S, - csi_rfft_fast_instance_f32 * S_RFFT, - csi_cfft_radix4_instance_f32 * S_CFFT, - uint16_t N, - uint16_t Nby2, - float32_t normalize); - - -/** - * @brief Processing function for the floating-point DCT4/IDCT4. - * @param[in] S points to an instance of the floating-point DCT4/IDCT4 structure. - * @param[in] pState points to state buffer. - * @param[in,out] pInlineBuffer points to the in-place input and output buffer. - */ -void csi_dct4_f32( - const csi_dct4_instance_f32 * S, - float32_t * pState, - float32_t * pInlineBuffer); - - - -/** - * @brief Initialization function for the Q31 DCT4/IDCT4. - * @param[in,out] S points to an instance of Q31 DCT4/IDCT4 structure. - * @param[in] S_RFFT points to an instance of Q31 RFFT/RIFFT structure - * @param[in] S_CFFT points to an instance of Q31 CFFT/CIFFT structure - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return csi_status function returns CSI_MATH_SUCCESS if initialization is successful or CSI_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length. - */ -csi_status csi_dct4_init_q31( - csi_dct4_instance_q31 * S, - csi_rfft_instance_q31 * S_RFFT, - csi_cfft_radix4_instance_q31 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q31_t normalize); - - -/** - * @brief Processing function for the Q31 DCT4/IDCT4. - * @param[in] S points to an instance of the Q31 DCT4 structure. - * @param[in] pState points to state buffer. - * @param[in,out] pInlineBuffer points to the in-place input and output buffer. - */ -void csi_dct4_q31( - const csi_dct4_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - -void csi_dct4_fast_q31( - const csi_dct4_fast_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - - -/** - * @brief Initialization function for the Q15 DCT4/IDCT4. - * @param[in,out] S points to an instance of Q15 DCT4/IDCT4 structure. - * @param[in] S_RFFT points to an instance of Q15 RFFT/RIFFT structure. - * @param[in] S_CFFT points to an instance of Q15 CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return csi_status function returns CSI_MATH_SUCCESS if initialization is successful or CSI_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length. - */ -csi_status csi_dct4_init_q15( - csi_dct4_instance_q15 * S, - csi_rfft_instance_q15 * S_RFFT, - csi_cfft_radix4_instance_q15 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q15_t normalize); - - -/** - * @brief Processing function for the Q15 DCT4/IDCT4. - * @param[in] S points to an instance of the Q15 DCT4 structure. - * @param[in] pState points to state buffer. - * @param[in,out] pInlineBuffer points to the in-place input and output buffer. - */ -void csi_dct4_q15( - const csi_dct4_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer); - -void csi_dct4_fast_q15( - const csi_dct4_fast_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer); - - -/** - * @brief Floating-point vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ -void csi_add_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Q7 vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ -void csi_add_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Q15 vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ -void csi_add_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Q31 vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ -void csi_add_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Floating-point vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ -void csi_sub_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Q7 vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ -void csi_sub_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Q15 vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ -void csi_sub_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Q31 vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ -void csi_sub_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Multiplies a floating-point vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scale scale factor to be applied - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_scale_f32( - const float32_t * pSrc, - float32_t scale, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Multiplies a Q7 vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_scale_q7( - const q7_t * pSrc, - q7_t scaleFract, - int8_t shift, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Multiplies a Q15 vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_scale_q15( - const q15_t * pSrc, - q15_t scaleFract, - int8_t shift, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Multiplies a Q31 vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_scale_q31( - const q31_t * pSrc, - q31_t scaleFract, - int8_t shift, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Q7 vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ -void csi_abs_q7( - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Floating-point vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ -void csi_abs_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Q15 vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ -void csi_abs_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Q31 vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ -void csi_abs_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csi_abs_max_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csi_abs_max_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Dot product of floating-point vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ -void csi_dot_prod_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t blockSize, - float32_t * result); - - -/** - * @brief Dot product of Q7 vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ -void csi_dot_prod_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - uint32_t blockSize, - q31_t * result); - - -/** - * @brief Dot product of Q15 vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ -void csi_dot_prod_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - -/** - * @brief Dot product of Q31 vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ -void csi_dot_prod_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - -/** - * @brief Shifts the elements of a Q7 vector a specified number of bits. - * @param[in] pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_shift_q7( - const q7_t * pSrc, - int8_t shiftBits, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Shifts the elements of a Q15 vector a specified number of bits. - * @param[in] pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_shift_q15( - const q15_t * pSrc, - int8_t shiftBits, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Shifts the elements of a Q31 vector a specified number of bits. - * @param[in] pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_shift_q31( - const q31_t * pSrc, - int8_t shiftBits, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Adds a constant offset to a floating-point vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_offset_f32( - const float32_t * pSrc, - float32_t offset, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Adds a constant offset to a Q7 vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_offset_q7( - const q7_t * pSrc, - q7_t offset, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Adds a constant offset to a Q15 vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_offset_q15( - const q15_t * pSrc, - q15_t offset, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Adds a constant offset to a Q31 vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_offset_q31( - const q31_t * pSrc, - q31_t offset, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Negates the elements of a floating-point vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_negate_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Negates the elements of a Q7 vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_negate_q7( - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Negates the elements of a Q15 vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_negate_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Negates the elements of a Q31 vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ -void csi_negate_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Copies the elements of a floating-point vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ -void csi_copy_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Copies the elements of a Q7 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ -void csi_copy_q7( - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Copies the elements of a Q15 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ -void csi_copy_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Copies the elements of a Q31 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ -void csi_copy_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Fills a constant value into a floating-point vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ -void csi_fill_f32( - float32_t value, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Fills a constant value into a Q7 vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ -void csi_fill_q7( - q7_t value, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Fills a constant value into a Q15 vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ -void csi_fill_q15( - q15_t value, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Fills a constant value into a Q31 vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ -void csi_fill_q31( - q31_t value, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Convolution of floating-point sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - */ -void csi_conv_f32( - const float32_t * pSrcA, - uint32_t srcALen, - const float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - -/** - * @brief Convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - */ -void csi_conv_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - */ -void csi_conv_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - -/** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ -void csi_conv_fast_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - -/** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - */ -void csi_conv_fast_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Convolution of Q31 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ -void csi_conv_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - -/** - * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ -void csi_conv_fast_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - -/** -* @brief Convolution of Q7 sequences. -* @param[in] pSrcA points to the first input sequence. -* @param[in] srcALen length of the first input sequence. -* @param[in] pSrcB points to the second input sequence. -* @param[in] srcBLen length of the second input sequence. -* @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. -* @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. -* @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). -*/ -void csi_conv_opt_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Convolution of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ -void csi_conv_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - -/** - * @brief Partial convolution of floating-point sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either CSI_MATH_SUCCESS if the function completed correctly or CSI_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ -csi_status csi_conv_partial_f32( - const float32_t * pSrcA, - uint32_t srcALen, - const float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - -/** - * @brief Partial convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either CSI_MATH_SUCCESS if the function completed correctly or CSI_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ -csi_status csi_conv_partial_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Partial convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either CSI_MATH_SUCCESS if the function completed correctly or CSI_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ -csi_status csi_conv_partial_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - -/** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either CSI_MATH_SUCCESS if the function completed correctly or CSI_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ -csi_status csi_conv_partial_fast_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - -/** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either CSI_MATH_SUCCESS if the function completed correctly or CSI_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ -csi_status csi_conv_partial_fast_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Partial convolution of Q31 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either CSI_MATH_SUCCESS if the function completed correctly or CSI_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ -csi_status csi_conv_partial_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - -/** - * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either CSI_MATH_SUCCESS if the function completed correctly or CSI_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ -csi_status csi_conv_partial_fast_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - -/** - * @brief Partial convolution of Q7 sequences - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return Returns either CSI_MATH_SUCCESS if the function completed correctly or CSI_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ -csi_status csi_conv_partial_opt_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Partial convolution of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either CSI_MATH_SUCCESS if the function completed correctly or CSI_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ -csi_status csi_conv_partial_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - -/** - @brief Processing function for floating-point FIR decimator. - @param[in] S points to an instance of the floating-point FIR decimator structure - @param[in] pSrc points to the block of input data - @param[out] pDst points to the block of output data - @param[in] blockSize number of samples to process - */ -void csi_fir_decimate_f32( - const csi_fir_decimate_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - @brief Initialization function for the floating-point FIR decimator. - @param[in,out] S points to an instance of the floating-point FIR decimator structure - @param[in] numTaps number of coefficients in the filter - @param[in] M decimation factor - @param[in] pCoeffs points to the filter coefficients - @param[in] pState points to the state buffer - @param[in] blockSize number of input samples to process per call - @return execution status - - \ref CSI_MATH_SUCCESS : Operation successful - - \ref CSI_MATH_LENGTH_ERROR : <code>blockSize</code> is not a multiple of <code>M</code> - */ -csi_status csi_fir_decimate_init_f32( - csi_fir_decimate_instance_f32 * S, - uint16_t numTaps, - uint8_t M, - const float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - -/** - * @brief Processing function for the Q15 FIR decimator. - * @param[in] S points to an instance of the Q15 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ -void csi_fir_decimate_q15( - const csi_fir_decimate_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q15 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ -void csi_fir_decimate_fast_q15( - const csi_fir_decimate_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q15 FIR decimator. - * @param[in,out] S points to an instance of the Q15 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns CSI_MATH_SUCCESS if initialization is successful or CSI_MATH_LENGTH_ERROR if - * <code>blockSize</code> is not a multiple of <code>M</code>. - */ -csi_status csi_fir_decimate_init_q15( - csi_fir_decimate_instance_q15 * S, - uint16_t numTaps, - uint8_t M, - const q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - -/** - * @brief Processing function for the Q31 FIR decimator. - * @param[in] S points to an instance of the Q31 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ -void csi_fir_decimate_q31( - const csi_fir_decimate_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - -/** - * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q31 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ -void csi_fir_decimate_fast_q31( - const csi_fir_decimate_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q31 FIR decimator. - * @param[in,out] S points to an instance of the Q31 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns CSI_MATH_SUCCESS if initialization is successful or CSI_MATH_LENGTH_ERROR if - * <code>blockSize</code> is not a multiple of <code>M</code>. - */ -csi_status csi_fir_decimate_init_q31( - csi_fir_decimate_instance_q31 * S, - uint16_t numTaps, - uint8_t M, - const q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - -/** - * @brief Processing function for the Q15 FIR interpolator. - * @param[in] S points to an instance of the Q15 FIR interpolator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - */ -void csi_fir_interpolate_q15( - const csi_fir_interpolate_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q15 FIR interpolator. - * @param[in,out] S points to an instance of the Q15 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns CSI_MATH_SUCCESS if initialization is successful or CSI_MATH_LENGTH_ERROR if - * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>. - */ -csi_status csi_fir_interpolate_init_q15( - csi_fir_interpolate_instance_q15 * S, - uint8_t L, - uint16_t numTaps, - const q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - -/** - * @brief Processing function for the Q31 FIR interpolator. - * @param[in] S points to an instance of the Q15 FIR interpolator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - */ -void csi_fir_interpolate_q31( - const csi_fir_interpolate_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q31 FIR interpolator. - * @param[in,out] S points to an instance of the Q31 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns CSI_MATH_SUCCESS if initialization is successful or CSI_MATH_LENGTH_ERROR if - * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>. - */ -csi_status csi_fir_interpolate_init_q31( - csi_fir_interpolate_instance_q31 * S, - uint8_t L, - uint16_t numTaps, - const q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - -/** - * @brief Processing function for the floating-point FIR interpolator. - * @param[in] S points to an instance of the floating-point FIR interpolator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - */ -void csi_fir_interpolate_f32( - const csi_fir_interpolate_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the floating-point FIR interpolator. - * @param[in,out] S points to an instance of the floating-point FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns CSI_MATH_SUCCESS if initialization is successful or CSI_MATH_LENGTH_ERROR if - * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>. - */ -csi_status csi_fir_interpolate_init_f32( - csi_fir_interpolate_instance_f32 * S, - uint8_t L, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - -/** - * @param[in] S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ -void csi_biquad_cas_df1_32x64_q31( - const csi_biquad_cas_df1_32x64_ins_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @param[in,out] S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format - */ -void csi_biquad_cas_df1_32x64_init_q31( - csi_biquad_cas_df1_32x64_ins_q31 * S, - uint8_t numStages, - const q31_t * pCoeffs, - q63_t * pState, - uint8_t postShift); - - -/** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in] S points to an instance of the filter data structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ -void csi_biquad_cascade_df2T_f32( - const csi_biquad_cascade_df2T_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels - * @param[in] S points to an instance of the filter data structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ -void csi_biquad_cascade_stereo_df2T_f32( - const csi_biquad_cascade_stereo_df2T_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in] S points to an instance of the filter data structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ -void csi_biquad_cascade_df2T_f64( - const csi_biquad_cascade_df2T_instance_f64 * S, - float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); - - -#if defined(CSI_MATH_NEON) -void csi_biquad_cascade_df2T_compute_coefs_f32( - csi_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs); -#endif -/** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ -void csi_biquad_cascade_df2T_init_f32( - csi_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pState); - - -/** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ -void csi_biquad_cascade_stereo_df2T_init_f32( - csi_biquad_cascade_stereo_df2T_instance_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pState); - - -/** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ -void csi_biquad_cascade_df2T_init_f64( - csi_biquad_cascade_df2T_instance_f64 * S, - uint8_t numStages, - float64_t * pCoeffs, - float64_t * pState); - - -/** - * @brief Initialization function for the Q15 FIR lattice filter. - * @param[in] S points to an instance of the Q15 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] pState points to the state buffer. The array is of length numStages. - */ -void csi_fir_lattice_init_q15( - csi_fir_lattice_instance_q15 * S, - uint16_t numStages, - const q15_t * pCoeffs, - q15_t * pState); - - -/** - * @brief Processing function for the Q15 FIR lattice filter. - * @param[in] S points to an instance of the Q15 FIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_fir_lattice_q15( - const csi_fir_lattice_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q31 FIR lattice filter. - * @param[in] S points to an instance of the Q31 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] pState points to the state buffer. The array is of length numStages. - */ -void csi_fir_lattice_init_q31( - csi_fir_lattice_instance_q31 * S, - uint16_t numStages, - const q31_t * pCoeffs, - q31_t * pState); - - -/** - * @brief Processing function for the Q31 FIR lattice filter. - * @param[in] S points to an instance of the Q31 FIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ -void csi_fir_lattice_q31( - const csi_fir_lattice_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the floating-point FIR lattice filter. - * @param[in] S points to an instance of the floating-point FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] pState points to the state buffer. The array is of length numStages. - */ -void csi_fir_lattice_init_f32( - csi_fir_lattice_instance_f32 * S, - uint16_t numStages, - const float32_t * pCoeffs, - float32_t * pState); - - -/** - * @brief Processing function for the floating-point FIR lattice filter. - * @param[in] S points to an instance of the floating-point FIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ -void csi_fir_lattice_f32( - const csi_fir_lattice_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Processing function for the floating-point IIR lattice filter. - * @param[in] S points to an instance of the floating-point IIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_iir_lattice_f32( - const csi_iir_lattice_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the floating-point IIR lattice filter. - * @param[in] S points to an instance of the floating-point IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] pState points to the state buffer. The array is of length numStages+blockSize-1. - * @param[in] blockSize number of samples to process. - */ -void csi_iir_lattice_init_f32( - csi_iir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pkCoeffs, - float32_t * pvCoeffs, - float32_t * pState, - uint32_t blockSize); - - -/** - * @brief Processing function for the Q31 IIR lattice filter. - * @param[in] S points to an instance of the Q31 IIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_iir_lattice_q31( - const csi_iir_lattice_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q31 IIR lattice filter. - * @param[in] S points to an instance of the Q31 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] pState points to the state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process. - */ -void csi_iir_lattice_init_q31( - csi_iir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pkCoeffs, - q31_t * pvCoeffs, - q31_t * pState, - uint32_t blockSize); - - -/** - * @brief Processing function for the Q15 IIR lattice filter. - * @param[in] S points to an instance of the Q15 IIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ -void csi_iir_lattice_q15( - const csi_iir_lattice_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q15 IIR lattice filter. - * @param[in] S points to an instance of the fixed-point Q15 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] pkCoeffs points to reflection coefficient buffer. The array is of length numStages. - * @param[in] pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. - * @param[in] pState points to state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process per call. - */ -void csi_iir_lattice_init_q15( - csi_iir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pkCoeffs, - q15_t * pvCoeffs, - q15_t * pState, - uint32_t blockSize); - - -/** - * @brief Processing function for floating-point LMS filter. - * @param[in] S points to an instance of the floating-point LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ -void csi_lms_f32( - const csi_lms_instance_f32 * S, - const float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - -/** - * @brief Initialization function for floating-point LMS filter. - * @param[in] S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to the coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - */ -void csi_lms_init_f32( - csi_lms_instance_f32 * S, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q15 LMS filter. - * @param[in] S points to an instance of the Q15 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to the coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ -void csi_lms_init_q15( - csi_lms_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint32_t postShift); - - -/** - * @brief Processing function for Q15 LMS filter. - * @param[in] S points to an instance of the Q15 LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ -void csi_lms_q15( - const csi_lms_instance_q15 * S, - const q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - -/** - * @brief Processing function for Q31 LMS filter. - * @param[in] S points to an instance of the Q15 LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ -void csi_lms_q31( - const csi_lms_instance_q31 * S, - const q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - -/** - * @brief Initialization function for Q31 LMS filter. - * @param[in] S points to an instance of the Q31 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ -void csi_lms_init_q31( - csi_lms_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint32_t postShift); - - -/** - * @brief Processing function for floating-point normalized LMS filter. - * @param[in] S points to an instance of the floating-point normalized LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ -void csi_lms_norm_f32( - csi_lms_norm_instance_f32 * S, - const float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - -/** - * @brief Initialization function for floating-point normalized LMS filter. - * @param[in] S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - */ -void csi_lms_norm_init_f32( - csi_lms_norm_instance_f32 * S, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - -/** - * @brief Processing function for Q31 normalized LMS filter. - * @param[in] S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ -void csi_lms_norm_q31( - csi_lms_norm_instance_q31 * S, - const q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - -/** - * @brief Initialization function for Q31 normalized LMS filter. - * @param[in] S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ -void csi_lms_norm_init_q31( - csi_lms_norm_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint8_t postShift); - - -/** - * @brief Processing function for Q15 normalized LMS filter. - * @param[in] S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ -void csi_lms_norm_q15( - csi_lms_norm_instance_q15 * S, - const q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - -/** - * @brief Initialization function for Q15 normalized LMS filter. - * @param[in] S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ -void csi_lms_norm_init_q15( - csi_lms_norm_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint8_t postShift); - - -/** - * @brief Correlation of floating-point sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ -void csi_correlate_f32( - const float32_t * pSrcA, - uint32_t srcALen, - const float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - -/** - @brief Correlation of Q15 sequences - @param[in] pSrcA points to the first input sequence - @param[in] srcALen length of the first input sequence - @param[in] pSrcB points to the second input sequence - @param[in] srcBLen length of the second input sequence - @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. -*/ -void csi_correlate_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - -/** - @brief Correlation of Q15 sequences. - @param[in] pSrcA points to the first input sequence - @param[in] srcALen length of the first input sequence - @param[in] pSrcB points to the second input sequence - @param[in] srcBLen length of the second input sequence - @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ -void csi_correlate_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - -/** - @brief Correlation of Q15 sequences (fast version). - @param[in] pSrcA points to the first input sequence - @param[in] srcALen length of the first input sequence - @param[in] pSrcB points to the second input sequence - @param[in] srcBLen length of the second input sequence - @param[out] pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - @return none - */ -void csi_correlate_fast_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - -/** - @brief Correlation of Q15 sequences (fast version). - @param[in] pSrcA points to the first input sequence. - @param[in] srcALen length of the first input sequence. - @param[in] pSrcB points to the second input sequence. - @param[in] srcBLen length of the second input sequence. - @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - */ -void csi_correlate_fast_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - -/** - * @brief Correlation of Q31 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ -void csi_correlate_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - -/** - @brief Correlation of Q31 sequences (fast version). - @param[in] pSrcA points to the first input sequence - @param[in] srcALen length of the first input sequence - @param[in] pSrcB points to the second input sequence - @param[in] srcBLen length of the second input sequence - @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ -void csi_correlate_fast_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - -/** - * @brief Correlation of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - */ -void csi_correlate_opt_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Correlation of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ -void csi_correlate_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - -/** - * @brief Processing function for the floating-point sparse FIR filter. - * @param[in] S points to an instance of the floating-point sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ -void csi_fir_sparse_f32( - csi_fir_sparse_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - float32_t * pScratchIn, - uint32_t blockSize); - - -/** - * @brief Initialization function for the floating-point sparse FIR filter. - * @param[in,out] S points to an instance of the floating-point sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ -void csi_fir_sparse_init_f32( - csi_fir_sparse_instance_f32 * S, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - -/** - * @brief Processing function for the Q31 sparse FIR filter. - * @param[in] S points to an instance of the Q31 sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ -void csi_fir_sparse_q31( - csi_fir_sparse_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - q31_t * pScratchIn, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q31 sparse FIR filter. - * @param[in,out] S points to an instance of the Q31 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ -void csi_fir_sparse_init_q31( - csi_fir_sparse_instance_q31 * S, - uint16_t numTaps, - const q31_t * pCoeffs, - q31_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - -/** - * @brief Processing function for the Q15 sparse FIR filter. - * @param[in] S points to an instance of the Q15 sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ -void csi_fir_sparse_q15( - csi_fir_sparse_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - q15_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q15 sparse FIR filter. - * @param[in,out] S points to an instance of the Q15 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ -void csi_fir_sparse_init_q15( - csi_fir_sparse_instance_q15 * S, - uint16_t numTaps, - const q15_t * pCoeffs, - q15_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - -/** - * @brief Processing function for the Q7 sparse FIR filter. - * @param[in] S points to an instance of the Q7 sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ -void csi_fir_sparse_q7( - csi_fir_sparse_instance_q7 * S, - const q7_t * pSrc, - q7_t * pDst, - q7_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q7 sparse FIR filter. - * @param[in,out] S points to an instance of the Q7 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ -void csi_fir_sparse_init_q7( - csi_fir_sparse_instance_q7 * S, - uint16_t numTaps, - const q7_t * pCoeffs, - q7_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - -/** - * @brief Floating-point sin_cos function. - * @param[in] theta input value in degrees - * @param[out] pSinVal points to the processed sine output. - * @param[out] pCosVal points to the processed cos output. - */ -void csi_sin_cos_f32( - float32_t theta, - float32_t * pSinVal, - float32_t * pCosVal); - - -/** - * @brief Q31 sin_cos function. - * @param[in] theta scaled input value in degrees - * @param[out] pSinVal points to the processed sine output. - * @param[out] pCosVal points to the processed cosine output. - */ -void csi_sin_cos_q31( - q31_t theta, - q31_t * pSinVal, - q31_t * pCosVal); - - -/** - * @brief Floating-point complex conjugate. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ -void csi_cmplx_conj_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - -/** - * @brief Q31 complex conjugate. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ -void csi_cmplx_conj_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - -/** - * @brief Q15 complex conjugate. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ -void csi_cmplx_conj_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - -/** - * @brief Floating-point complex magnitude squared - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ -void csi_cmplx_mag_squared_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - -/** - * @brief Q31 complex magnitude squared - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ -void csi_cmplx_mag_squared_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - -void csi_cmplx_mag_squared_q31_basic( - q31_t * pSrc, - q63_t * pDst, - uint32_t numSamples); - - -/** - * @brief Q15 complex magnitude squared - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ -void csi_cmplx_mag_squared_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - -/** - * @ingroup groupController - */ - -/** - * @defgroup PID PID Motor Control - * - * A Proportional Integral Derivative (PID) controller is a generic feedback control - * loop mechanism widely used in industrial control systems. - * A PID controller is the most commonly used type of feedback controller. - * - * This set of functions implements (PID) controllers - * for Q15, Q31, and floating-point data types. The functions operate on a single sample - * of data and each call to the function returns a single processed value. - * <code>S</code> points to an instance of the PID control data structure. <code>in</code> - * is the input sample value. The functions return the output value. - * - * \par Algorithm: - * <pre> - * y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] - * A0 = Kp + Ki + Kd - * A1 = (-Kp ) - (2 * Kd ) - * A2 = Kd - * </pre> - * - * \par - * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant - * - * \par - * \image html PID.gif "Proportional Integral Derivative Controller" - * - * \par - * The PID controller calculates an "error" value as the difference between - * the measured output and the reference input. - * The controller attempts to minimize the error by adjusting the process control inputs. - * The proportional value determines the reaction to the current error, - * the integral value determines the reaction based on the sum of recent errors, - * and the derivative value determines the reaction based on the rate at which the error has been changing. - * - * \par Instance Structure - * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. - * A separate instance structure must be defined for each PID Controller. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Reset Functions - * There is also an associated reset function for each data type which clears the state array. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. - * - Zeros out the values in the state buffer. - * - * \par - * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. - * - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the PID Controller functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup PID - * @{ - */ - -/** - * @brief Process function for the floating-point PID Control. - * @param[in,out] S is an instance of the floating-point PID Control structure - * @param[in] in input sample to process - * @return processed output sample. - */ -__STATIC_FORCEINLINE float32_t csi_pid_f32( - csi_pid_instance_f32 * S, - float32_t in) -{ - float32_t out; - /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ - out = (S->A0 * in) + - (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - /* return to application */ - return (out); -} - -/** - @brief Process function for the Q31 PID Control. - @param[in,out] S points to an instance of the Q31 PID Control structure - @param[in] in input sample to process - @return processed output sample. - - \par Scaling and Overflow Behavior - The function is implemented using an internal 64-bit accumulator. - The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - Thus, if the accumulator result overflows it wraps around rather than clip. - In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. - After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. - */ -__STATIC_FORCEINLINE q31_t csi_pid_q31( - csi_pid_instance_q31 * S, - q31_t in) -{ - q63_t acc; - q31_t out; - /* acc = A0 * x[n] */ - acc = (q63_t) S->A0 * in; - /* acc += A1 * x[n-1] */ - acc += (q63_t) S->A1 * S->state[0]; - /* acc += A2 * x[n-2] */ - acc += (q63_t) S->A2 * S->state[1]; - /* convert output to 1.31 format to add y[n-1] */ - out = (q31_t) (acc >> 31U); - /* out += y[n-1] */ - out += S->state[2]; - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - /* return to application */ - return (out); -} - - -/** - @brief Process function for the Q15 PID Control. - @param[in,out] S points to an instance of the Q15 PID Control structure - @param[in] in input sample to process - @return processed output sample. - - \par Scaling and Overflow Behavior - The function is implemented using a 64-bit internal accumulator. - Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - Lastly, the accumulator is saturated to yield a result in 1.15 format. - */ -__STATIC_FORCEINLINE q15_t csi_pid_q15( - csi_pid_instance_q15 * S, - q15_t in) -{ - q63_t acc; - q15_t out; -#if defined (CSI_MATH_DSP) - /* Implementation of PID controller */ - /* acc = A0 * x[n] */ - acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in); - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)read_q15x2 (S->state), (uint64_t)acc); -#else - /* acc = A0 * x[n] */ - acc = ((q31_t) S->A0) * in; - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc += (q31_t) S->A1 * S->state[0]; - acc += (q31_t) S->A2 * S->state[1]; -#endif - /* acc += y[n-1] */ - acc += (q31_t) S->state[2] << 15; - /* saturate the output */ - out = (q15_t) (__SSAT((q31_t)(acc >> 15), 16)); - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - /* return to application */ - return (out); -} - -/** - * @} end of PID group - */ - - -/** - * @brief Floating-point matrix inverse. - * @param[in] src points to the instance of the input floating-point matrix structure. - * @param[out] dst points to the instance of the output floating-point matrix structure. - * @return The function returns CSI_MATH_SIZE_MISMATCH, if the dimensions do not match. - * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status CSI_MATH_SINGULAR. - */ -csi_status csi_mat_inverse_f32( - const csi_matrix_instance_f32 * src, - csi_matrix_instance_f32 * dst); - - -/** - * @brief Floating-point matrix inverse. - * @param[in] src points to the instance of the input floating-point matrix structure. - * @param[out] dst points to the instance of the output floating-point matrix structure. - * @return The function returns CSI_MATH_SIZE_MISMATCH, if the dimensions do not match. - * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status CSI_MATH_SINGULAR. - */ -csi_status csi_mat_inverse_f64( - const csi_matrix_instance_f64 * src, - csi_matrix_instance_f64 * dst); - - - -/** - * @ingroup groupController - */ - -/** - * @defgroup clarke Vector Clarke Transform - * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. - * Generally the Clarke transform uses three-phase currents <code>Ia, Ib and Ic</code> to calculate currents - * in the two-phase orthogonal stator axis <code>Ialpha</code> and <code>Ibeta</code>. - * When <code>Ialpha</code> is superposed with <code>Ia</code> as shown in the figure below - * \image html clarke.gif Stator current space vector and its components in (a,b). - * and <code>Ia + Ib + Ic = 0</code>, in this condition <code>Ialpha</code> and <code>Ibeta</code> - * can be calculated using only <code>Ia</code> and <code>Ib</code>. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeFormula.gif - * where <code>Ia</code> and <code>Ib</code> are the instantaneous stator phases and - * <code>pIalpha</code> and <code>pIbeta</code> are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup clarke - * @{ - */ - -/** - * - * @brief Floating-point Clarke transform - * @param[in] Ia input three-phase coordinate <code>a</code> - * @param[in] Ib input three-phase coordinate <code>b</code> - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - * @return none - */ -__STATIC_FORCEINLINE void csi_clarke_f32( - float32_t Ia, - float32_t Ib, - float32_t * pIalpha, - float32_t * pIbeta) -{ - /* Calculate pIalpha using the equation, pIalpha = Ia */ - *pIalpha = Ia; - /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ - *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); -} - - -/** - @brief Clarke transform for Q31 version - @param[in] Ia input three-phase coordinate <code>a</code> - @param[in] Ib input three-phase coordinate <code>b</code> - @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - @param[out] pIbeta points to output two-phase orthogonal vector axis beta - @return none - - \par Scaling and Overflow Behavior - The function is implemented using an internal 32-bit accumulator. - The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - There is saturation on the addition, hence there is no risk of overflow. - */ -__STATIC_FORCEINLINE void csi_clarke_q31( - q31_t Ia, - q31_t Ib, - q31_t * pIalpha, - q31_t * pIbeta) -{ - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - /* Calculating pIalpha from Ia by equation pIalpha = Ia */ - *pIalpha = Ia; - /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); - /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ - product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); - /* pIbeta is calculated by adding the intermediate products */ - *pIbeta = __QADD(product1, product2); -} - -/** - * @} end of clarke group - */ - - -/** - * @ingroup groupController - */ - -/** - * @defgroup inv_clarke Vector Inverse Clarke Transform - * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeInvFormula.gif - * where <code>pIa</code> and <code>pIb</code> are the instantaneous stator phases and - * <code>Ialpha</code> and <code>Ibeta</code> are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup inv_clarke - * @{ - */ - -/** -* @brief Floating-point Inverse Clarke transform -* @param[in] Ialpha input two-phase orthogonal vector axis alpha -* @param[in] Ibeta input two-phase orthogonal vector axis beta -* @param[out] pIa points to output three-phase coordinate <code>a</code> -* @param[out] pIb points to output three-phase coordinate <code>b</code> -* @return none -*/ -__STATIC_FORCEINLINE void csi_inv_clarke_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pIa, - float32_t * pIb) -{ - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ - *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta; -} - - -/** - @brief Inverse Clarke transform for Q31 version - @param[in] Ialpha input two-phase orthogonal vector axis alpha - @param[in] Ibeta input two-phase orthogonal vector axis beta - @param[out] pIa points to output three-phase coordinate <code>a</code> - @param[out] pIb points to output three-phase coordinate <code>b</code> - @return none - - \par Scaling and Overflow Behavior - The function is implemented using an internal 32-bit accumulator. - The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - There is saturation on the subtraction, hence there is no risk of overflow. - */ -__STATIC_FORCEINLINE void csi_inv_clarke_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pIa, - q31_t * pIb) -{ - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); - /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); - /* pIb is calculated by subtracting the products */ - *pIb = __QSUB(product2, product1); -} - -/** - * @} end of inv_clarke group - */ - - - -/** - * @ingroup groupController - */ - -/** - * @defgroup park Vector Park Transform - * - * Forward Park transform converts the input two-coordinate vector to flux and torque components. - * The Park transform can be used to realize the transformation of the <code>Ialpha</code> and the <code>Ibeta</code> currents - * from the stationary to the moving reference frame and control the spatial relationship between - * the stator vector current and rotor flux vector. - * If we consider the d axis aligned with the rotor flux, the diagram below shows the - * current vector and the relationship from the two reference frames: - * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkFormula.gif - * where <code>Ialpha</code> and <code>Ibeta</code> are the stator vector components, - * <code>pId</code> and <code>pIq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup park - * @{ - */ - -/** - * @brief Floating-point Park transform - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] pId points to output rotor reference frame d - * @param[out] pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none - * - * The function implements the forward Park transform. - * - */ -__STATIC_FORCEINLINE void csi_park_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pId, - float32_t * pIq, - float32_t sinVal, - float32_t cosVal) -{ - /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ - *pId = Ialpha * cosVal + Ibeta * sinVal; - /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ - *pIq = -Ialpha * sinVal + Ibeta * cosVal; -} - - -/** - @brief Park transform for Q31 version - @param[in] Ialpha input two-phase vector coordinate alpha - @param[in] Ibeta input two-phase vector coordinate beta - @param[out] pId points to output rotor reference frame d - @param[out] pIq points to output rotor reference frame q - @param[in] sinVal sine value of rotation angle theta - @param[in] cosVal cosine value of rotation angle theta - @return none - - \par Scaling and Overflow Behavior - The function is implemented using an internal 32-bit accumulator. - The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - There is saturation on the addition and subtraction, hence there is no risk of overflow. - */ -__STATIC_FORCEINLINE void csi_park_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pId, - q31_t * pIq, - q31_t sinVal, - q31_t cosVal) -{ -#ifdef CSI_SIMD - asm volatile( - "rmul.s32.h t0, %0, %3\n\t" - "rmul.s32.h t1, %1, %2\n\t" - "add.s32.s t0, t0, t1\n\t" - "st.w t0, (%4, 0x0)\n\t" - "rmul.s32.h t0, %0, %2\n\t" - "rmul.s32.h t1, %1, %3\n\t" - "sub.s32.s t1, t1, t0\n\t" - "st.w t1, (%5, 0x0)\n\t" - ::"r"(Ialpha),"r"(Ibeta),"r"(sinVal),"r"(cosVal),"r"(pId),"r"(pIq) - :"t0","t1", "memory"); -#else - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - /* Intermediate product is calculated by (Ialpha * cosVal) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); - /* Intermediate product is calculated by (Ibeta * sinVal) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); - /* Intermediate product is calculated by (Ialpha * sinVal) */ - product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); - /* Intermediate product is calculated by (Ibeta * cosVal) */ - product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); - /* Calculate pId by adding the two intermediate products 1 and 2 */ - *pId = __QADD(product1, product2); - /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ - *pIq = __QSUB(product4, product3); -#endif -} - -/** - * @} end of park group - */ - - -/** - * @ingroup groupController - */ - -/** - * @defgroup inv_park Vector Inverse Park transform - * Inverse Park transform converts the input flux and torque components to two-coordinate vector. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkInvFormula.gif - * where <code>pIalpha</code> and <code>pIbeta</code> are the stator vector components, - * <code>Id</code> and <code>Iq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup inv_park - * @{ - */ - -/** -* @brief Floating-point Inverse Park transform -* @param[in] Id input coordinate of rotor reference frame d -* @param[in] Iq input coordinate of rotor reference frame q -* @param[out] pIalpha points to output two-phase orthogonal vector axis alpha -* @param[out] pIbeta points to output two-phase orthogonal vector axis beta -* @param[in] sinVal sine value of rotation angle theta -* @param[in] cosVal cosine value of rotation angle theta -* @return none -*/ -__STATIC_FORCEINLINE void csi_inv_park_f32( - float32_t Id, - float32_t Iq, - float32_t * pIalpha, - float32_t * pIbeta, - float32_t sinVal, - float32_t cosVal) -{ - /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ - *pIalpha = Id * cosVal - Iq * sinVal; - /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ - *pIbeta = Id * sinVal + Iq * cosVal; -} - - -/** - @brief Inverse Park transform for Q31 version - @param[in] Id input coordinate of rotor reference frame d - @param[in] Iq input coordinate of rotor reference frame q - @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - @param[out] pIbeta points to output two-phase orthogonal vector axis beta - @param[in] sinVal sine value of rotation angle theta - @param[in] cosVal cosine value of rotation angle theta - @return none - - @par Scaling and Overflow Behavior - The function is implemented using an internal 32-bit accumulator. - The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - There is saturation on the addition, hence there is no risk of overflow. - */ -__STATIC_FORCEINLINE void csi_inv_park_q31( - q31_t Id, - q31_t Iq, - q31_t * pIalpha, - q31_t * pIbeta, - q31_t sinVal, - q31_t cosVal) -{ -#ifdef CSI_SIMD - asm volatile( - "rmul.s32.h t0, %0, %3\n\t" - "rmul.s32.h t1, %1, %2\n\t" - "sub.s32.s t0, t0, t1\n\t" - "st.w t0, (%4, 0x0)\n\t" - "rmul.s32.h t0, %0, %2\n\t" - "rmul.s32.h t1, %1, %3\n\t" - "add.s32.s t0, t0, t1\n\t" - "st.w t0, (%5, 0x0)\n\t" - ::"r"(Id),"r"(Iq),"r"(sinVal),"r"(cosVal),"r"(pIalpha),"r"(pIbeta) - :"t0","t1", "memory"); -#else - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - /* Intermediate product is calculated by (Id * cosVal) */ - product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); - /* Intermediate product is calculated by (Iq * sinVal) */ - product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); - /* Intermediate product is calculated by (Id * sinVal) */ - product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); - /* Intermediate product is calculated by (Iq * cosVal) */ - product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); - /* Calculate pIalpha by using the two intermediate products 1 and 2 */ - *pIalpha = __QSUB(product1, product2); - /* Calculate pIbeta by using the two intermediate products 3 and 4 */ - *pIbeta = __QADD(product4, product3); -#endif -} - -/** - * @} end of Inverse park group - */ - - -/** - * @ingroup groupInterpolation - */ - -/** - * @defgroup LinearInterpolate Linear Interpolation - * - * Linear interpolation is a method of curve fitting using linear polynomials. - * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line - * - * \par - * \image html LinearInterp.gif "Linear interpolation" - * - * \par - * A Linear Interpolate function calculates an output value(y), for the input(x) - * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) - * - * \par Algorithm: - * <pre> - * y = y0 + (x - x0) * ((y1 - y0)/(x1-x0)) - * where x0, x1 are nearest values of input x - * y0, y1 are nearest values to output y - * </pre> - * - * \par - * This set of functions implements Linear interpolation process - * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single - * sample of data and each call to the function returns a single processed value. - * <code>S</code> points to an instance of the Linear Interpolate function data structure. - * <code>x</code> is the input sample value. The functions returns the output value. - * - * \par - * if x is outside of the table boundary, Linear interpolation returns first value of the table - * if x is below input range and returns last value of table if x is above range. - */ - -/** - * @addtogroup LinearInterpolate - * @{ - */ - -/** - * @brief Process function for the floating-point Linear Interpolation Function. - * @param[in,out] S is an instance of the floating-point Linear Interpolation structure - * @param[in] x input sample to process - * @return y processed output sample. - * - */ -__STATIC_FORCEINLINE float32_t csi_linear_interp_f32( - csi_linear_interp_instance_f32 * S, - float32_t x) -{ - float32_t y; - float32_t x0, x1; /* Nearest input values */ - float32_t y0, y1; /* Nearest output values */ - float32_t xSpacing = S->xSpacing; /* spacing between input values */ - int32_t i; /* Index variable */ - float32_t *pYData = S->pYData; /* pointer to output table */ - /* Calculation of index */ - i = (int32_t) ((x - S->x1) / xSpacing); - - if (i < 0) { - /* Iniatilize output for below specified range as least output value of table */ - y = pYData[0]; - - } else if ((uint32_t)i >= (S->nValues - 1)) { - /* Iniatilize output for above specified range as last output value of table */ - y = pYData[S->nValues - 1]; - - } else { - /* Calculation of nearest input values */ - x0 = S->x1 + i * xSpacing; - x1 = S->x1 + (i + 1) * xSpacing; - /* Read of nearest output values */ - y0 = pYData[i]; - y1 = pYData[i + 1]; - /* Calculation of output */ - y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); - } - - /* returns output value */ - return (y); -} - - -/** -* -* @brief Process function for the Q31 Linear Interpolation Function. -* @param[in] pYData pointer to Q31 Linear Interpolation table -* @param[in] x input sample to process -* @param[in] nValues number of table values -* @return y processed output sample. -* -* \par -* Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. -* This function can support maximum of table size 2^12. -* -*/ -__STATIC_FORCEINLINE q31_t csi_linear_interp_q31( - q31_t * pYData, - q31_t x, - uint32_t nValues) -{ - q31_t y; /* output */ - q31_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & (q31_t)0xFFF00000) >> 20); - - if (index >= (int32_t)(nValues - 1)) { - return (pYData[nValues - 1]); - - } else if (index < 0) { - return (pYData[0]); - - } else { - /* 20 bits for the fractional part */ - /* shift left by 11 to keep fract in 1.31 format */ - fract = (x & 0x000FFFFF) << 11; - /* Read two nearest output values from the index in 1.31(q31) format */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - /* Calculation of y0 * (1-fract) and y is in 2.30 format */ - y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); - /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ - y += ((q31_t) (((q63_t) y1 * fract) >> 32)); - /* Convert y to 1.31 format */ - return (y << 1U); - } -} - - -/** - * - * @brief Process function for the Q15 Linear Interpolation Function. - * @param[in] pYData pointer to Q15 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ -__STATIC_FORCEINLINE q15_t csi_linear_interp_q15( - q15_t * pYData, - q31_t x, - uint32_t nValues) -{ - q63_t y; /* output */ - q15_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & (int32_t)0xFFF00000) >> 20); - - if (index >= (int32_t)(nValues - 1)) { - return (pYData[nValues - 1]); - - } else if (index < 0) { - return (pYData[0]); - - } else { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - /* Read two nearest output values from the index */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - /* Calculation of y0 * (1-fract) and y is in 13.35 format */ - y = ((q63_t) y0 * (0xFFFFF - fract)); - /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ - y += ((q63_t) y1 * (fract)); - /* convert y to 1.15 format */ - return (q15_t) (y >> 20); - } -} - - -/** - * - * @brief Process function for the Q7 Linear Interpolation Function. - * @param[in] pYData pointer to Q7 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - */ -__STATIC_FORCEINLINE q7_t csi_linear_interp_q7( - q7_t * pYData, - q31_t x, - uint32_t nValues) -{ - q31_t y; /* output */ - q7_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - uint32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - if (x < 0) { - return (pYData[0]); - } - - index = (x >> 20) & 0xfff; - - if (index >= (nValues - 1)) { - return (pYData[nValues - 1]); - - } else { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - /* Read two nearest output values from the index and are in 1.7(q7) format */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ - y = ((y0 * (0xFFFFF - fract))); - /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ - y += (y1 * fract); - /* convert y to 1.7(q7) format */ - return (q7_t) (y >> 20); - } -} - -/** - * @} end of LinearInterpolate group - */ - -/** - * @brief Fast approximation to the trigonometric sine function for floating-point data. - * @param[in] x input value in radians. - * @return sin(x). - */ -float32_t csi_sin_f32( - float32_t x); - - -/** - * @brief Fast approximation to the trigonometric sine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ -q31_t csi_sin_q31( - q31_t x); - - -/** - * @brief Fast approximation to the trigonometric sine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ -q15_t csi_sin_q15( - q15_t x); - - -/** - * @brief Fast approximation to the trigonometric cosine function for floating-point data. - * @param[in] x input value in radians. - * @return cos(x). - */ -float32_t csi_cos_f32( - float32_t x); - - -/** - * @brief Fast approximation to the trigonometric cosine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ -q31_t csi_cos_q31( - q31_t x); - - -/** - * @brief Fast approximation to the trigonometric cosine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ -q15_t csi_cos_q15( - q15_t x); - - -/** - @brief Floating-point vector of log values. - @param[in] pSrc points to the input vector - @param[out] pDst points to the output vector - @param[in] blockSize number of samples in each vector - @return none - */ -void csi_vlog_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - -/** - @brief Floating-point vector of exp values. - @param[in] pSrc points to the input vector - @param[out] pDst points to the output vector - @param[in] blockSize number of samples in each vector - @return none - */ -void csi_vexp_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - -/** - * @ingroup groupFastMath - */ - - -/** - * @defgroup SQRT Square Root - * - * Computes the square root of a number. - * There are separate functions for Q15, Q31, and floating-point data types. - * The square root function is computed using the Newton-Raphson algorithm. - * This is an iterative algorithm of the form: - * <pre> - * x1 = x0 - f(x0)/f'(x0) - * </pre> - * where <code>x1</code> is the current estimate, - * <code>x0</code> is the previous estimate, and - * <code>f'(x0)</code> is the derivative of <code>f()</code> evaluated at <code>x0</code>. - * For the square root function, the algorithm reduces to: - * <pre> - * x0 = in/2 [initial guess] - * x1 = 1/2 * ( x0 + in / x0) [each iteration] - * </pre> - */ - - -/** - * @addtogroup SQRT - * @{ - */ - -/** - @brief Q15 square root function. - @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF - @param[out] pOut points to square root of input value - @return execution status - - \ref CSI_MATH_SUCCESS : input value is positive - - \ref CSI_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 - */ -csi_status csi_sqrt_q15( - q15_t in, - q15_t * pOut); - -/** - @brief Floating-point square root function. - @param[in] in input value - @param[out] pOut square root of input value - @return execution status - - \ref CSI_MATH_SUCCESS : input value is positive - - \ref CSI_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 - */ -#ifdef __riscv -__STATIC_FORCEINLINE csi_status csi_sqrt_f32( - float32_t in, - float32_t * pOut) -{ - if (in >= 0.0f) { -#ifdef CSI_NEWTON_SQRTF - float32_t eps = 0.000000011; - float32_t val = in / 2; - float32_t last; - - if (in <= eps) { - *pOut = 0.0f; - } else { - do { - last = val; - val = (val + in / val) / 2; - } while (fabsf(val - last) > eps); - *pOut = val; - } -#else - *pOut = sqrtf(in); -#endif - return (CSI_MATH_SUCCESS); - } else { - *pOut = 0.0f; - return (CSI_MATH_ARGUMENT_ERROR); - } -} -#else -csi_status csi_sqrt_f32( - float32_t in, - float32_t * pOut); -#endif - - -/** - @brief Q31 square root function. - @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF - @param[out] pOut points to square root of input value - @return execution status - - \ref CSI_MATH_SUCCESS : input value is positive - - \ref CSI_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 - */ -csi_status csi_sqrt_q31( - q31_t in, - q31_t * pOut); - -/** - * @brief Vector Floating-point square root function. - * @param[in] pIn input vector. - * @param[out] pOut vector of square roots of input elements. - * @param[in] len length of input vector. - * @return The function returns CSI_MATH_SUCCESS if input value is positive value or CSI_MATH_ARGUMENT_ERROR if - * <code>in</code> is negative value and returns zero output for negative values. - */ -#ifdef __csky__ - -void csi_vsqrt_f32( - float32_t * pIn, - float32_t * pOut, - uint16_t len); - - void csi_vsqrt_q15( - q15_t * pIn, - q15_t * pOut, - uint16_t len); - -void csi_vsqrt_q31( - q31_t * pIn, - q31_t * pOut, - uint16_t len); - -void csi_vsqrt_q7( - q7_t * pIn, - q7_t * pOut, - uint16_t len); - - -#else -__STATIC_FORCEINLINE void csi_vsqrt_f32( - float32_t * pIn, - float32_t * pOut, - uint16_t len) -{ - for (int i = 0; i < len; i++) { - csi_sqrt_f32(pIn[i], pOut + i); - } -} - -__STATIC_FORCEINLINE void csi_vsqrt_q15( - q15_t * pIn, - q15_t * pOut, - uint16_t len -) -{ - for (int i = 0; i < len; i++) { - csi_sqrt_q15(pIn[i], pOut + i); - } -} -__STATIC_FORCEINLINE void csi_vsqrt_q31( - q31_t * pIn, - q31_t * pOut, - uint16_t len -) -{ - for (int i = 0; i < len; i++) { - csi_sqrt_q31(pIn[i], pOut + i); - } -} -#endif -/** - * @} end of SQRT group - */ - -/** - * @brief floating-point Circular write function. - a*/ -#ifndef __csky__ -__STATIC_FORCEINLINE void csi_circularWrite_f32( - int32_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const int32_t * src, - int32_t srcInc, - uint32_t blockSize) -{ - uint32_t i = 0U; - int32_t wOffset; - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - /* Update the input pointer */ - src += srcInc; - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - - if (wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = (uint16_t)wOffset; -} - - - -/** - * @brief floating-point Circular Read function. - */ -__STATIC_FORCEINLINE void csi_circularRead_f32( - int32_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - int32_t * dst, - int32_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) -{ - uint32_t i = 0U; - int32_t rOffset; - int32_t* dst_end; - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - dst_end = dst_base + dst_length; - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - /* Update the input pointer */ - dst += dstInc; - - if (dst == dst_end) { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if (rOffset >= L) { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; -} -#endif -/** - * @brief Sum of the squares of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_power_q31( - const q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - -void csi_power_int32( - int32_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - -/** - * @brief Sum of the squares of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_power_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - -/** - * @brief Sum of the squares of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_power_q15( - const q15_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - -/** - * @brief Sum of the squares of the elements of a Q7 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_power_q7( - const q7_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - -/** - * @brief Mean value of a Q7 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_mean_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult); - - -/** - * @brief Mean value of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_mean_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - -/** - * @brief Mean value of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_mean_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - -/** - * @brief Mean value of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_mean_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - -/** - * @brief Variance of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_var_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - -/** - * @brief Variance of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_var_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - -/** - * @brief Variance of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_var_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - -/** - * @brief Root Mean Square of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_rms_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - -/** - * @brief Root Mean Square of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_rms_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - -/** - * @brief Root Mean Square of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_rms_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - -/** - * @brief Standard deviation of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_std_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - -/** - * @brief Standard deviation of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_std_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - -/** - * @brief Standard deviation of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ -void csi_std_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - -/** - * @brief Floating-point complex magnitude - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ -void csi_cmplx_mag_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - -/** - * @brief Q31 complex magnitude - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ -void csi_cmplx_mag_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - -/** - * @brief Q15 complex magnitude - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ -void csi_cmplx_mag_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - -/** - * @brief Q15 complex dot product - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] realResult real part of the result returned here - * @param[out] imagResult imaginary part of the result returned here - */ -void csi_cmplx_dot_prod_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - uint32_t numSamples, - q31_t * realResult, - q31_t * imagResult); - - -/** - * @brief Q31 complex dot product - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] realResult real part of the result returned here - * @param[out] imagResult imaginary part of the result returned here - */ -void csi_cmplx_dot_prod_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - uint32_t numSamples, - q63_t * realResult, - q63_t * imagResult); - - void csi_dot_prod_u64xu8( - uint8_t * pSrcA, - uint64_t * pSrcB, - uint32_t blockSize, - uint64_t * result); - -/** - * @brief Floating-point complex dot product - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] realResult real part of the result returned here - * @param[out] imagResult imaginary part of the result returned here - */ -void csi_cmplx_dot_prod_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t numSamples, - float32_t * realResult, - float32_t * imagResult); - - -/** - * @brief Q15 complex-by-real multiplication - * @param[in] pSrcCmplx points to the complex input vector - * @param[in] pSrcReal points to the real input vector - * @param[out] pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - */ -void csi_cmplx_mult_real_q15( - const q15_t * pSrcCmplx, - const q15_t * pSrcReal, - q15_t * pCmplxDst, - uint32_t numSamples); - - -/** - * @brief Q31 complex-by-real multiplication - * @param[in] pSrcCmplx points to the complex input vector - * @param[in] pSrcReal points to the real input vector - * @param[out] pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - */ -void csi_cmplx_mult_real_q31( - const q31_t * pSrcCmplx, - const q31_t * pSrcReal, - q31_t * pCmplxDst, - uint32_t numSamples); - - -/** - * @brief Floating-point complex-by-real multiplication - * @param[in] pSrcCmplx points to the complex input vector - * @param[in] pSrcReal points to the real input vector - * @param[out] pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - */ -void csi_cmplx_mult_real_f32( - const float32_t * pSrcCmplx, - const float32_t * pSrcReal, - float32_t * pCmplxDst, - uint32_t numSamples); - - -/** - * @brief Minimum value of a Q7 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] result is output pointer - * @param[in] index is the array index of the minimum value in the input buffer. - */ -void csi_min_q7( - const q7_t * pSrc, - uint16_t blockSize, - q7_t * result, - uint16_t * index); - - -/** - * @brief Minimum value of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output pointer - * @param[in] pIndex is the array index of the minimum value in the input buffer. - */ -void csi_min_q15( - const q15_t * pSrc, - uint16_t blockSize, - q15_t * pResult, - uint16_t * pIndex); - - -/** - * @brief Minimum value of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output pointer - * @param[out] pIndex is the array index of the minimum value in the input buffer. - */ -void csi_min_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Minimum value of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output pointer - * @param[out] pIndex is the array index of the minimum value in the input buffer. - */ -void csi_min_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a Q7 vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ -void csi_max_q7( - const q7_t * pSrc, - uint16_t blockSize, - q7_t * pResult, - uint16_t * pIndex); - - -/** - * @brief Maximum value of a Q15 vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ -void csi_max_q15( - const q15_t * pSrc, - uint16_t blockSize, - q15_t * pResult, - uint16_t * pIndex); - - -/** - * @brief Maximum value of a Q31 vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ -void csi_max_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a floating-point vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ -void csi_max_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - -/** - @brief Maximum value of a floating-point vector. - @param[in] pSrc points to the input vector - @param[in] blockSize number of samples in input vector - @param[out] pResult maximum value returned here - @return none - */ -void csi_max_no_idx_f32( - const float32_t *pSrc, - uint32_t blockSize, - float32_t *pResult); - -/** - * @brief Q15 complex-by-complex multiplication - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ -void csi_cmplx_mult_cmplx_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t numSamples); - - -/** - * @brief Q31 complex-by-complex multiplication - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ -void csi_cmplx_mult_cmplx_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t numSamples); - - -/** - * @brief Floating-point complex-by-complex multiplication - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ -void csi_cmplx_mult_cmplx_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - -void csi_cmplx_mult_cmplx_re_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - - -/** - * @brief Converts the elements of the floating-point vector to Q31 vector. - * @param[in] pSrc points to the floating-point input vector - * @param[out] pDst points to the Q31 output vector - * @param[in] blockSize length of the input vector - */ -void csi_float_to_q31( - const float32_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Converts the elements of the floating-point vector to Q15 vector. - * @param[in] pSrc points to the floating-point input vector - * @param[out] pDst points to the Q15 output vector - * @param[in] blockSize length of the input vector - */ -void csi_float_to_q15( - const float32_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Converts the elements of the floating-point vector to Q7 vector. - * @param[in] pSrc points to the floating-point input vector - * @param[out] pDst points to the Q7 output vector - * @param[in] blockSize length of the input vector - */ -void csi_float_to_q7( - const float32_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Converts the elements of the Q31 vector to floating-point vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ -void csi_q31_to_float( - const q31_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Converts the elements of the Q31 vector to Q15 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ -void csi_q31_to_q15( - const q31_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - -void csi_q31_to_q7_rs( - q31_t * pSrc, - q7_t * pDst, - uint32_t shiftValue, - uint32_t blockSize); - -void csi_q63_to_q31_rs( - q63_t * pSrc, - q31_t * pDst, - uint32_t shiftValue, - uint32_t blockSize); - - -/** - * @brief Converts the elements of the Q31 vector to Q7 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ -void csi_q31_to_q7( - const q31_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Converts the elements of the Q15 vector to floating-point vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ -void csi_q15_to_float( - const q15_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Converts the elements of the Q15 vector to Q31 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ -void csi_q15_to_q31( - const q15_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Converts the elements of the Q15 vector to Q7 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ -void csi_q15_to_q7( - const q15_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - -/** - * @brief Converts the elements of the Q7 vector to floating-point vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ -void csi_q7_to_float( - const q7_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - * @brief Converts the elements of the Q7 vector to Q31 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ -void csi_q7_to_q31( - const q7_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Converts the elements of the Q7 vector to Q15 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ -void csi_q7_to_q15( - const q7_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief SVM linear instance init function - * @param[in] S Parameters for SVM functions - * @param[in] nbOfSupportVectors Number of support vectors - * @param[in] vectorDimension Dimension of vector space - * @param[in] intercept Intercept - * @param[in] dualCoefficients Array of dual coefficients - * @param[in] supportVectors Array of support vectors - * @param[in] classes Array of 2 classes ID - * @return none. - * - */ - - -void csi_svm_linear_init_f32(csi_svm_linear_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes); - -/** - * @brief SVM linear prediction - * @param[in] S Pointer to an instance of the linear SVM structure. - * @param[in] in Pointer to input vector - * @param[out] pResult Decision value - * @return none. - * - */ - -void csi_svm_linear_predict_f32(const csi_svm_linear_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - - -/** - * @brief SVM polynomial instance init function - * @param[in] S points to an instance of the polynomial SVM structure. - * @param[in] nbOfSupportVectors Number of support vectors - * @param[in] vectorDimension Dimension of vector space - * @param[in] intercept Intercept - * @param[in] dualCoefficients Array of dual coefficients - * @param[in] supportVectors Array of support vectors - * @param[in] classes Array of 2 classes ID - * @param[in] degree Polynomial degree - * @param[in] coef0 coeff0 (scikit-learn terminology) - * @param[in] gamma gamma (scikit-learn terminology) - * @return none. - * - */ - - -void csi_svm_polynomial_init_f32(csi_svm_polynomial_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes, - int32_t degree, - float32_t coef0, - float32_t gamma - ); - -/** - * @brief SVM polynomial prediction - * @param[in] S Pointer to an instance of the polynomial SVM structure. - * @param[in] in Pointer to input vector - * @param[out] pResult Decision value - * @return none. - * - */ -void csi_svm_polynomial_predict_f32(const csi_svm_polynomial_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - - -/** - * @brief SVM radial basis function instance init function - * @param[in] S points to an instance of the polynomial SVM structure. - * @param[in] nbOfSupportVectors Number of support vectors - * @param[in] vectorDimension Dimension of vector space - * @param[in] intercept Intercept - * @param[in] dualCoefficients Array of dual coefficients - * @param[in] supportVectors Array of support vectors - * @param[in] classes Array of 2 classes ID - * @param[in] gamma gamma (scikit-learn terminology) - * @return none. - * - */ - -void csi_svm_rbf_init_f32(csi_svm_rbf_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes, - float32_t gamma - ); - -/** - * @brief SVM rbf prediction - * @param[in] S Pointer to an instance of the rbf SVM structure. - * @param[in] in Pointer to input vector - * @param[out] pResult decision value - * @return none. - * - */ -void csi_svm_rbf_predict_f32(const csi_svm_rbf_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - -/** - * @brief SVM sigmoid instance init function - * @param[in] S points to an instance of the rbf SVM structure. - * @param[in] nbOfSupportVectors Number of support vectors - * @param[in] vectorDimension Dimension of vector space - * @param[in] intercept Intercept - * @param[in] dualCoefficients Array of dual coefficients - * @param[in] supportVectors Array of support vectors - * @param[in] classes Array of 2 classes ID - * @param[in] coef0 coeff0 (scikit-learn terminology) - * @param[in] gamma gamma (scikit-learn terminology) - * @return none. - * - */ - -void csi_svm_sigmoid_init_f32(csi_svm_sigmoid_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes, - float32_t coef0, - float32_t gamma - ); - -/** - * @brief SVM sigmoid prediction - * @param[in] S Pointer to an instance of the rbf SVM structure. - * @param[in] in Pointer to input vector - * @param[out] pResult Decision value - * @return none. - * - */ -void csi_svm_sigmoid_predict_f32(const csi_svm_sigmoid_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - - -/** - * @brief Naive Gaussian Bayesian Estimator - * - * @param[in] S points to a naive bayes instance structure - * @param[in] in points to the elements of the input vector. - * @param[in] pBuffer points to a buffer of length numberOfClasses - * @return The predicted class - * - */ - - -uint32_t csi_gaussian_naive_bayes_predict_f32(const csi_gaussian_naive_bayes_instance_f32 *S, - const float32_t * in, - float32_t *pBuffer); - -/** - * @brief Computation of the LogSumExp - * - * In probabilistic computations, the dynamic of the probability values can be very - * wide because they come from gaussian functions. - * To avoid underflow and overflow issues, the values are represented by their log. - * In this representation, multiplying the original exp values is easy : their logs are added. - * But adding the original exp values is requiring some special handling and it is the - * goal of the LogSumExp function. - * - * If the values are x1...xn, the function is computing: - * - * ln(exp(x1) + ... + exp(xn)) and the computation is done in such a way that - * rounding issues are minimised. - * - * The max xm of the values is extracted and the function is computing: - * xm + ln(exp(x1 - xm) + ... + exp(xn - xm)) - * - * @param[in] *in Pointer to an array of input values. - * @param[in] blockSize Number of samples in the input array. - * @return LogSumExp - * - */ - - -float32_t csi_logsumexp_f32(const float32_t *in, uint32_t blockSize); - -/** - * @brief Dot product with log arithmetic - * - * Vectors are containing the log of the samples - * - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[in] pTmpBuffer temporary buffer of length blockSize - * @return The log of the dot product . - * - */ - - -float32_t csi_logsumexp_dot_prod_f32(const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t blockSize, - float32_t *pTmpBuffer); - -/** - * @brief Entropy - * - * @param[in] pSrcA Array of input values. - * @param[in] blockSize Number of samples in the input array. - * @return Entropy -Sum(p ln p) - * - */ - - -float32_t csi_entropy_f32(const float32_t * pSrcA,uint32_t blockSize); - - -/** - * @brief Kullback-Leibler - * - * @param[in] pSrcA Pointer to an array of input values for probability distribution A. - * @param[in] pSrcB Pointer to an array of input values for probability distribution B. - * @param[in] blockSize Number of samples in the input array. - * @return Kullback-Leibler Divergence D(A || B) - * - */ -float32_t csi_kullback_leibler_f32(const float32_t * pSrcA - ,const float32_t * pSrcB - ,uint32_t blockSize); - - -/** - * @brief Weighted sum - * - * - * @param[in] *in Array of input values. - * @param[in] *weigths Weights - * @param[in] blockSize Number of samples in the input array. - * @return Weighted sum - * - */ -float32_t csi_weighted_sum_f32(const float32_t *in - , const float32_t *weigths - , uint32_t blockSize); - - -/** - * @brief Barycenter - * - * - * @param[in] in List of vectors - * @param[in] weights Weights of the vectors - * @param[out] out Barycenter - * @param[in] nbVectors Number of vectors - * @param[in] vecDim Dimension of space (vector dimension) - * @return None - * - */ -void csi_barycenter_f32(const float32_t *in - , const float32_t *weights - , float32_t *out - , uint32_t nbVectors - , uint32_t vecDim); - -/** - * @brief Euclidean distance between two vectors - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ - -float32_t csi_euclidean_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - -/** - * @brief Bray-Curtis distance between two vectors - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t csi_braycurtis_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - -/** - * @brief Canberra distance between two vectors - * - * This function may divide by zero when samples pA[i] and pB[i] are both zero. - * The result of the computation will be correct. So the division per zero may be - * ignored. - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t csi_canberra_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - - -/** - * @brief Chebyshev distance between two vectors - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t csi_chebyshev_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - - -/** - * @brief Cityblock (Manhattan) distance between two vectors - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t csi_cityblock_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - -/** - * @brief Correlation distance between two vectors - * - * The input vectors are modified in place ! - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t csi_correlation_distance_f32(float32_t *pA,float32_t *pB, uint32_t blockSize); - -/** - * @brief Cosine distance between two vectors - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ - -float32_t csi_cosine_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - -/** - * @brief Jensen-Shannon distance between two vectors - * - * This function is assuming that elements of second vector are > 0 - * and 0 only when the corresponding element of first vector is 0. - * Otherwise the result of the computation does not make sense - * and for speed reasons, the cases returning NaN or Infinity are not - * managed. - * - * When the function is computing x log (x / y) with x 0 and y 0, - * it will compute the right value (0) but a division per zero will occur - * and shoudl be ignored in client code. - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ - -float32_t csi_jensenshannon_distance_f32(const float32_t *pA,const float32_t *pB,uint32_t blockSize); - -/** - * @brief Minkowski distance between two vectors - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] n Norm order (>= 2) - * @param[in] blockSize vector length - * @return distance - * - */ - - - -float32_t csi_minkowski_distance_f32(const float32_t *pA,const float32_t *pB, int32_t order, uint32_t blockSize); - -/** - * @brief Dice distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] order Distance order - * @param[in] blockSize Number of samples - * @return distance - * - */ - - -float32_t csi_dice_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Hamming distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t csi_hamming_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Jaccard distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t csi_jaccard_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Kulsinski distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t csi_kulsinski_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Roger Stanimoto distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t csi_rogerstanimoto_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Russell-Rao distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t csi_russellrao_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Sokal-Michener distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t csi_sokalmichener_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Sokal-Sneath distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t csi_sokalsneath_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Yule distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t csi_yule_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - - -/** - * @ingroup groupInterpolation - */ - -/** - * @defgroup BilinearInterpolate Bilinear Interpolation - * - * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. - * The underlying function <code>f(x, y)</code> is sampled on a regular grid and the interpolation process - * determines values between the grid points. - * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. - * Bilinear interpolation is often used in image processing to rescale images. - * The library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. - * - * <b>Algorithm</b> - * \par - * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. - * For floating-point, the instance structure is defined as: - * <pre> - * typedef struct - * { - * uint16_t numRows; - * uint16_t numCols; - * float32_t *pData; - * } csi_bilinear_interp_instance_f32; - * </pre> - * - * \par - * where <code>numRows</code> specifies the number of rows in the table; - * <code>numCols</code> specifies the number of columns in the table; - * and <code>pData</code> points to an array of size <code>numRows*numCols</code> values. - * The data table <code>pTable</code> is organized in row order and the supplied data values fall on integer indexes. - * That is, table element (x,y) is located at <code>pTable[x + y*numCols]</code> where x and y are integers. - * - * \par - * Let <code>(x, y)</code> specify the desired interpolation point. Then define: - * <pre> - * XF = floor(x) - * YF = floor(y) - * </pre> - * \par - * The interpolated output point is computed as: - * <pre> - * f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF)) - * + f(XF+1, YF) * (x-XF)*(1-(y-YF)) - * + f(XF, YF+1) * (1-(x-XF))*(y-YF) - * + f(XF+1, YF+1) * (x-XF)*(y-YF) - * </pre> - * Note that the coordinates (x, y) contain integer and fractional components. - * The integer components specify which portion of the table to use while the - * fractional components control the interpolation processor. - * - * \par - * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. - */ - - -/** - * @addtogroup BilinearInterpolate - * @{ - */ - -/** -* @brief Floating-point bilinear interpolation. -* @param[in,out] S points to an instance of the interpolation structure. -* @param[in] X interpolation coordinate. -* @param[in] Y interpolation coordinate. -* @return out interpolated value. -*/ -__STATIC_FORCEINLINE float32_t csi_bilinear_interp_f32( - const csi_bilinear_interp_instance_f32 * S, - float32_t X, - float32_t Y) -{ - float32_t out; - float32_t f00, f01, f10, f11; - float32_t *pData = S->pData; - int32_t xIndex, yIndex, index; - float32_t xdiff, ydiff; - float32_t b1, b2, b3, b4; - xIndex = (int32_t) X; - yIndex = (int32_t) Y; - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if (xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0 || yIndex > (S->numCols - 1)) { - return (0); - } - - /* Calculation of index for two nearest points in X-direction */ - index = (xIndex - 1) + (yIndex - 1) * S->numCols; - /* Read two nearest points in X-direction */ - f00 = pData[index]; - f01 = pData[index + 1]; - /* Calculation of index for two nearest points in Y-direction */ - index = (xIndex - 1) + (yIndex) * S->numCols; - /* Read two nearest points in Y-direction */ - f10 = pData[index]; - f11 = pData[index + 1]; - /* Calculation of intermediate values */ - b1 = f00; - b2 = f01 - f00; - b3 = f10 - f00; - b4 = f00 - f01 - f10 + f11; - /* Calculation of fractional part in X */ - xdiff = X - xIndex; - /* Calculation of fractional part in Y */ - ydiff = Y - yIndex; - /* Calculation of bi-linear interpolated output */ - out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; - /* return to application */ - return (out); -} - - -/** -* @brief Q31 bilinear interpolation. -* @param[in,out] S points to an instance of the interpolation structure. -* @param[in] X interpolation coordinate in 12.20 format. -* @param[in] Y interpolation coordinate in 12.20 format. -* @return out interpolated value. -*/ -__STATIC_FORCEINLINE q31_t csi_bilinear_interp_q31( - csi_bilinear_interp_instance_q31 * S, - q31_t X, - q31_t Y) -{ - q31_t out; /* Temporary output */ - q31_t acc = 0; /* output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q31_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q31_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) { - return (0); - } - - /* 20 bits for the fractional part */ - /* shift left xfract by 11 to keep 1.31 format */ - xfract = (X & 0x000FFFFF) << 11U; - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + (int32_t)nCols * (cI) ]; - x2 = pYData[(rI) + (int32_t)nCols * (cI) + 1]; - /* 20 bits for the fractional part */ - /* shift left yfract by 11 to keep 1.31 format */ - yfract = (Y & 0x000FFFFF) << 11U; - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + (int32_t)nCols * (cI + 1) ]; - y2 = pYData[(rI) + (int32_t)nCols * (cI + 1) + 1]; - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ - out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); - acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); - /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); - /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - /* Convert acc to 1.31(q31) format */ - return ((q31_t)(acc << 2)); -} - - -/** -* @brief Q15 bilinear interpolation. -* @param[in,out] S points to an instance of the interpolation structure. -* @param[in] X interpolation coordinate in 12.20 format. -* @param[in] Y interpolation coordinate in 12.20 format. -* @return out interpolated value. -*/ -__STATIC_FORCEINLINE q15_t csi_bilinear_interp_q15( - csi_bilinear_interp_instance_q15 * S, - q31_t X, - q31_t Y) -{ - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q15_t x1, x2, y1, y2; /* Nearest output values */ - q31_t xfract, yfract; /* X, Y fractional parts */ - int32_t rI, cI; /* Row and column indices */ - q15_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) { - return (0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & 0x000FFFFF); - /* Read two nearest output values from the index */ - x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; - x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & 0x000FFFFF); - /* Read two nearest output values from the index */ - y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; - y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ - /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ - /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ - out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4U); - acc = ((q63_t) out * (0xFFFFF - yfract)); - /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4U); - acc += ((q63_t) out * (xfract)); - /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4U); - acc += ((q63_t) out * (yfract)); - /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y2 * (xfract)) >> 4U); - acc += ((q63_t) out * (yfract)); - /* acc is in 13.51 format and down shift acc by 36 times */ - /* Convert out to 1.15 format */ - return ((q15_t)(acc >> 36)); -} - - -/** -* @brief Q7 bilinear interpolation. -* @param[in,out] S points to an instance of the interpolation structure. -* @param[in] X interpolation coordinate in 12.20 format. -* @param[in] Y interpolation coordinate in 12.20 format. -* @return out interpolated value. -*/ -__STATIC_FORCEINLINE q7_t csi_bilinear_interp_q7( - csi_bilinear_interp_instance_q7 * S, - q31_t X, - q31_t Y) -{ - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q7_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q7_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) { - return (0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & (q31_t)0x000FFFFF); - /* Read two nearest output values from the index */ - x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; - x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & (q31_t)0x000FFFFF); - /* Read two nearest output values from the index */ - y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; - y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ - out = ((x1 * (0xFFFFF - xfract))); - acc = (((q63_t) out * (0xFFFFF - yfract))); - /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ - out = ((x2 * (0xFFFFF - yfract))); - acc += (((q63_t) out * (xfract))); - /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y1 * (0xFFFFF - xfract))); - acc += (((q63_t) out * (yfract))); - /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y2 * (yfract))); - acc += (((q63_t) out * (xfract))); - /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ - return ((q7_t)(acc >> 40)); -} - -/** - * @} end of BilinearInterpolate group - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* _CSI_MATH_H */ - -/** - * - * End of file. - */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_common_tables.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_common_tables.h deleted file mode 100644 index 13a96dca..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_common_tables.h +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (C) 2016-2019 C-SKY Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file csky_common_tables.h - * @brief This file has extern declaration for common tables like - * Bitreverse, reciprocal etc which are used across different functions. - * @version V1.0 - * @date 20. Dec 2016 - ******************************************************************************/ - -#ifndef _CSKY_COMMON_TABLES_H -#define _CSKY_COMMON_TABLES_H - -#include "csky_math.h" - -extern const uint16_t cskyBitRevTable[1024]; -extern const q15_t cskyRecipTableQ15[64]; -extern const q31_t cskyRecipTableQ31[64]; -extern const uint32_t twiddleCoef_16[32]; -extern const uint32_t twiddleCoef_32[64]; -extern const uint32_t twiddleCoef_64[128]; -extern const uint32_t twiddleCoef_128[256]; -extern const uint32_t twiddleCoef_256[512]; -extern const uint32_t twiddleCoef_512[1024]; -extern const uint32_t twiddleCoef_1024[2048]; -extern const uint32_t twiddleCoef_2048[4096]; -extern const uint32_t twiddleCoef_4096[8192]; -extern const q31_t twiddleCoef_16_q31[24]; -extern const q31_t twiddleCoef_32_q31[48]; -extern const q31_t twiddleCoef_64_q31[96]; -extern const q31_t twiddleCoef_128_q31[192]; -extern const q31_t twiddleCoef_256_q31[384]; -extern const q31_t twiddleCoef_512_q31[768]; -extern const q31_t twiddleCoef_1024_q31[1536]; -extern const q31_t twiddleCoef_2048_q31[3072]; -extern const q31_t twiddleCoef_4096_q31[6144]; -extern const q15_t twiddleCoef_16_q15[24]; -extern const q15_t twiddleCoef_32_q15[48]; -extern const q15_t twiddleCoef_64_q15[96]; -extern const q15_t twiddleCoef_128_q15[192]; -extern const q15_t twiddleCoef_256_q15[384]; -extern const q15_t twiddleCoef_512_q15[768]; -extern const q15_t twiddleCoef_1024_q15[1536]; -extern const q15_t twiddleCoef_2048_q15[3072]; -extern const q15_t twiddleCoef_4096_q15[6144]; -extern const float32_t twiddleCoef_rfft_32[32]; -extern const float32_t twiddleCoef_rfft_64[64]; -extern const float32_t twiddleCoef_rfft_128[128]; -extern const float32_t twiddleCoef_rfft_256[256]; -extern const float32_t twiddleCoef_rfft_512[512]; -extern const float32_t twiddleCoef_rfft_1024[1024]; -extern const float32_t twiddleCoef_rfft_2048[2048]; -extern const float32_t twiddleCoef_rfft_4096[4096]; -extern const float32_t twiddleCoef_rfft_8192[8192]; - -extern const q15_t twiddleCoef_fast_16_q15[24]; -extern const q15_t twiddleCoef_fast_32_q15[56]; -extern const q15_t twiddleCoef_fast_64_q15[120]; -extern const q15_t twiddleCoef_fast_128_q15[248]; -extern const q15_t twiddleCoef_fast_256_q15[504]; -extern const q15_t twiddleCoef_fast_512_q15[1016]; -extern const q15_t twiddleCoef_fast_1024_q15[2040]; -extern const q15_t twiddleCoef_fast_2048_q15[4088]; -extern const q15_t twiddleCoef_fast_4096_q15[8184]; - -extern const q31_t twiddleCoef_fast_16_q31[24]; -extern const q31_t twiddleCoef_fast_32_q31[56]; -extern const q31_t twiddleCoef_fast_64_q31[120]; -extern const q31_t twiddleCoef_fast_128_q31[248]; -extern const q31_t twiddleCoef_fast_256_q31[504]; -extern const q31_t twiddleCoef_fast_512_q31[1016]; -extern const q31_t twiddleCoef_fast_1024_q31[2040]; -extern const q31_t twiddleCoef_fast_2048_q31[4088]; -extern const q31_t twiddleCoef_fast_4096_q31[8184]; - -extern const uint32_t twiddleCoef_fast_16[24]; -extern const uint32_t twiddleCoef_fast_32[56]; -extern const uint32_t twiddleCoef_fast_64[120]; -extern const uint32_t twiddleCoef_fast_128[248]; -extern const uint32_t twiddleCoef_fast_256[504]; -extern const uint32_t twiddleCoef_fast_512[1016]; -extern const uint32_t twiddleCoef_fast_1024[2040]; -extern const uint32_t twiddleCoef_fast_2048[4088]; -extern const uint32_t twiddleCoef_fast_4096[8184]; - -extern const q15_t realCoefAQ15_8192[8192]; -extern const q31_t realCoefAQ31_8192[8192]; -extern const q15_t realCoefBQ15_8192[8192]; -extern const q31_t realCoefBQ31_8192[8192]; - -/*Tables for RFFT.*/ -extern const q15_t ALIGN4 realCoefAQ15_32[32]; -extern const q15_t ALIGN4 realCoefAQ15_64[64]; -extern const q15_t ALIGN4 realCoefAQ15_128[128]; -extern const q15_t ALIGN4 realCoefAQ15_256[256]; -extern const q15_t ALIGN4 realCoefAQ15_512[512]; -extern const q15_t ALIGN4 realCoefAQ15_1024[1024]; -extern const q15_t ALIGN4 realCoefAQ15_2048[2048]; -extern const q15_t ALIGN4 realCoefAQ15_4096[4096]; - -extern const q15_t ALIGN4 realCoefBQ15_32[32]; -extern const q15_t ALIGN4 realCoefBQ15_64[64]; -extern const q15_t ALIGN4 realCoefBQ15_128[128]; -extern const q15_t ALIGN4 realCoefBQ15_256[256]; -extern const q15_t ALIGN4 realCoefBQ15_512[512]; -extern const q15_t ALIGN4 realCoefBQ15_1024[1024]; -extern const q15_t ALIGN4 realCoefBQ15_2048[2048]; -extern const q15_t ALIGN4 realCoefBQ15_4096[4096]; - -extern const q31_t realCoefAQ31_32[32]; -extern const q31_t realCoefAQ31_64[64]; -extern const q31_t realCoefAQ31_128[128]; -extern const q31_t realCoefAQ31_256[256]; -extern const q31_t realCoefAQ31_512[512]; -extern const q31_t realCoefAQ31_1024[1024]; -extern const q31_t realCoefAQ31_2048[2048]; -extern const q31_t realCoefAQ31_4096[4096]; - -extern const q31_t realCoefBQ31_32[32]; -extern const q31_t realCoefBQ31_64[64]; -extern const q31_t realCoefBQ31_128[128]; -extern const q31_t realCoefBQ31_256[256]; -extern const q31_t realCoefBQ31_512[512]; -extern const q31_t realCoefBQ31_1024[1024]; -extern const q31_t realCoefBQ31_2048[2048]; -extern const q31_t realCoefBQ31_4096[4096]; - - -extern const float32_t realCoefA[8192]; -extern const float32_t realCoefB[8192]; - - -/*Tables for DCT4*/ -extern const q15_t ALIGN4 WeightsQ15_128[128+2]; -extern const q15_t ALIGN4 WeightsQ15_512[512+2]; -extern const q15_t ALIGN4 WeightsQ15_2048[2048+2]; -extern const q15_t ALIGN4 WeightsQ15_8192[8192+2]; - -extern const q15_t ALIGN4 cos_factorsQ15_128[128]; -extern const q15_t ALIGN4 cos_factorsQ15_512[512]; -extern const q15_t ALIGN4 cos_factorsQ15_2048[2048]; -extern const q15_t ALIGN4 cos_factorsQ15_8192[8192]; - - -extern const q31_t WeightsQ31_128[128+2]; -extern const q31_t WeightsQ31_512[512+2]; -extern const q31_t WeightsQ31_2048[2048+2]; -extern const q31_t WeightsQ31_8192[8192+2]; - -extern const q31_t cos_factorsQ31_128[128]; -extern const q31_t cos_factorsQ31_512[512]; -extern const q31_t cos_factorsQ31_2048[2048]; -extern const q31_t cos_factorsQ31_8192[8192]; - - -extern const float32_t Weights_128[128+2]; -extern const float32_t Weights_512[512+2]; -extern const float32_t Weights_2048[2048+2]; -extern const float32_t Weights_8192[8192+2]; - -extern const float32_t cos_factors_128[128]; -extern const float32_t cos_factors_512[512]; -extern const float32_t cos_factors_2048[2048]; -extern const float32_t cos_factors_8192[8192]; - -/* floating-point bit reversal tables */ -#define CSKYBITREVINDEXTABLE__16_TABLE_LENGTH ((uint16_t)20 ) -#define CSKYBITREVINDEXTABLE__32_TABLE_LENGTH ((uint16_t)48 ) -#define CSKYBITREVINDEXTABLE__64_TABLE_LENGTH ((uint16_t)56 ) -#define CSKYBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208 ) -#define CSKYBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440 ) -#define CSKYBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448 ) -#define CSKYBITREVINDEXTABLE1024_TABLE_LENGTH ((uint16_t)1800) -#define CSKYBITREVINDEXTABLE2048_TABLE_LENGTH ((uint16_t)3808) -#define CSKYBITREVINDEXTABLE4096_TABLE_LENGTH ((uint16_t)4032) - -extern const uint16_t cskyBitRevIndexTable16[CSKYBITREVINDEXTABLE__16_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable32[CSKYBITREVINDEXTABLE__32_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable64[CSKYBITREVINDEXTABLE__64_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable128[CSKYBITREVINDEXTABLE_128_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable256[CSKYBITREVINDEXTABLE_256_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable512[CSKYBITREVINDEXTABLE_512_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable1024[CSKYBITREVINDEXTABLE1024_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable2048[CSKYBITREVINDEXTABLE2048_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable4096[CSKYBITREVINDEXTABLE4096_TABLE_LENGTH]; - -/* fixed-point bit reversal tables */ -#define CSKYBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH ((uint16_t)12 ) -#define CSKYBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH ((uint16_t)24 ) -#define CSKYBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH ((uint16_t)56 ) -#define CSKYBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH ((uint16_t)112 ) -#define CSKYBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH ((uint16_t)240 ) -#define CSKYBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH ((uint16_t)480 ) -#define CSKYBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992 ) -#define CSKYBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984) -#define CSKYBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032) - -extern const uint16_t cskyBitRevIndexTable_fixed_16[CSKYBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable_fixed_32[CSKYBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable_fixed_64[CSKYBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable_fixed_128[CSKYBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable_fixed_256[CSKYBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable_fixed_512[CSKYBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable_fixed_1024[CSKYBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable_fixed_2048[CSKYBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH]; -extern const uint16_t cskyBitRevIndexTable_fixed_4096[CSKYBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH]; - -/* Tables for Fast Math Sine and Cosine */ -extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1]; -extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1]; -extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1]; - -#endif /* CSKY_COMMON_TABLES_H */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_const_structs.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_const_structs.h deleted file mode 100644 index 1f5b5409..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_const_structs.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2016-2019 C-SKY Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file csky_const_structs.h - * @brief This file has constant structs that are initialized for - * user convenience. For example, some can be given as - * arguments to the csky_cfft_f32() function. - * @version V1.0 - * @date 20. Dec 2016 - ******************************************************************************/ - -#ifndef _CSKY_CONST_STRUCTS_H -#define _CSKY_CONST_STRUCTS_H - -#include "csky_math.h" -#include "csky_common_tables.h" - - extern const csky_cfft_instance_f32 csky_cfft_sR_f32_len16; - extern const csky_cfft_instance_f32 csky_cfft_sR_f32_len32; - extern const csky_cfft_instance_f32 csky_cfft_sR_f32_len64; - extern const csky_cfft_instance_f32 csky_cfft_sR_f32_len128; - extern const csky_cfft_instance_f32 csky_cfft_sR_f32_len256; - extern const csky_cfft_instance_f32 csky_cfft_sR_f32_len512; - extern const csky_cfft_instance_f32 csky_cfft_sR_f32_len1024; - extern const csky_cfft_instance_f32 csky_cfft_sR_f32_len2048; - extern const csky_cfft_instance_f32 csky_cfft_sR_f32_len4096; - - extern const csky_cfft_instance_q31 csky_cfft_sR_q31_len16; - extern const csky_cfft_instance_q31 csky_cfft_sR_q31_len32; - extern const csky_cfft_instance_q31 csky_cfft_sR_q31_len64; - extern const csky_cfft_instance_q31 csky_cfft_sR_q31_len128; - extern const csky_cfft_instance_q31 csky_cfft_sR_q31_len256; - extern const csky_cfft_instance_q31 csky_cfft_sR_q31_len512; - extern const csky_cfft_instance_q31 csky_cfft_sR_q31_len1024; - extern const csky_cfft_instance_q31 csky_cfft_sR_q31_len2048; - extern const csky_cfft_instance_q31 csky_cfft_sR_q31_len4096; - - extern const csky_cfft_instance_q15 csky_cfft_sR_q15_len16; - extern const csky_cfft_instance_q15 csky_cfft_sR_q15_len32; - extern const csky_cfft_instance_q15 csky_cfft_sR_q15_len64; - extern const csky_cfft_instance_q15 csky_cfft_sR_q15_len128; - extern const csky_cfft_instance_q15 csky_cfft_sR_q15_len256; - extern const csky_cfft_instance_q15 csky_cfft_sR_q15_len512; - extern const csky_cfft_instance_q15 csky_cfft_sR_q15_len1024; - extern const csky_cfft_instance_q15 csky_cfft_sR_q15_len2048; - extern const csky_cfft_instance_q15 csky_cfft_sR_q15_len4096; - - extern csky_rfft_instance_q15 csky_rfft_sR_q15_len32; - extern csky_rfft_instance_q15 csky_rfft_sR_q15_len64; - extern csky_rfft_instance_q15 csky_rfft_sR_q15_len128; - extern csky_rfft_instance_q15 csky_rfft_sR_q15_len256; - extern csky_rfft_instance_q15 csky_rfft_sR_q15_len512; - extern csky_rfft_instance_q15 csky_rfft_sR_q15_len1024; - extern csky_rfft_instance_q15 csky_rfft_sR_q15_len2048; - extern csky_rfft_instance_q15 csky_rfft_sR_q15_len4096; - extern csky_rfft_instance_q15 csky_rfft_sR_q15_len8192; - - - extern csky_rfft_instance_q15 csky_inv_rfft_sR_q15_len32; - extern csky_rfft_instance_q15 csky_inv_rfft_sR_q15_len64; - extern csky_rfft_instance_q15 csky_inv_rfft_sR_q15_len128; - extern csky_rfft_instance_q15 csky_inv_rfft_sR_q15_len256; - extern csky_rfft_instance_q15 csky_inv_rfft_sR_q15_len512; - extern csky_rfft_instance_q15 csky_inv_rfft_sR_q15_len1024; - extern csky_rfft_instance_q15 csky_inv_rfft_sR_q15_len2048; - extern csky_rfft_instance_q15 csky_inv_rfft_sR_q15_len4096; - extern csky_rfft_instance_q15 csky_inv_rfft_sR_q15_len8192; - - - extern csky_rfft_instance_q31 csky_rfft_sR_q31_len32; - extern csky_rfft_instance_q31 csky_rfft_sR_q31_len64; - extern csky_rfft_instance_q31 csky_rfft_sR_q31_len128; - extern csky_rfft_instance_q31 csky_rfft_sR_q31_len256; - extern csky_rfft_instance_q31 csky_rfft_sR_q31_len512; - extern csky_rfft_instance_q31 csky_rfft_sR_q31_len1024; - extern csky_rfft_instance_q31 csky_rfft_sR_q31_len2048; - extern csky_rfft_instance_q31 csky_rfft_sR_q31_len4096; - extern csky_rfft_instance_q31 csky_rfft_sR_q31_len8192; - - extern csky_rfft_instance_q31 csky_inv_rfft_sR_q31_len32; - extern csky_rfft_instance_q31 csky_inv_rfft_sR_q31_len64; - extern csky_rfft_instance_q31 csky_inv_rfft_sR_q31_len128; - extern csky_rfft_instance_q31 csky_inv_rfft_sR_q31_len256; - extern csky_rfft_instance_q31 csky_inv_rfft_sR_q31_len512; - extern csky_rfft_instance_q31 csky_inv_rfft_sR_q31_len1024; - extern csky_rfft_instance_q31 csky_inv_rfft_sR_q31_len2048; - extern csky_rfft_instance_q31 csky_inv_rfft_sR_q31_len4096; - extern csky_rfft_instance_q31 csky_inv_rfft_sR_q31_len8192; - - - extern csky_rfft_fast_instance_f32 csky_rfft_sR_f32_len32; - extern csky_rfft_fast_instance_f32 csky_rfft_sR_f32_len64; - extern csky_rfft_fast_instance_f32 csky_rfft_sR_f32_len128; - extern csky_rfft_fast_instance_f32 csky_rfft_sR_f32_len256; - extern csky_rfft_fast_instance_f32 csky_rfft_sR_f32_len512; - extern csky_rfft_fast_instance_f32 csky_rfft_sR_f32_len1024; - extern csky_rfft_fast_instance_f32 csky_rfft_sR_f32_len2048; - extern csky_rfft_fast_instance_f32 csky_rfft_sR_f32_len4096; - extern csky_rfft_fast_instance_f32 csky_rfft_sR_f32_len8192; - - extern csky_dct4_instance_q15 csky_dct4_sR_q15_len128; - extern csky_dct4_instance_q15 csky_dct4_sR_q15_len512; - extern csky_dct4_instance_q15 csky_dct4_sR_q15_len2048; - extern csky_dct4_instance_q15 csky_dct4_sR_q15_len8192; - - extern csky_dct4_instance_q31 csky_dct4_sR_q31_len128; - extern csky_dct4_instance_q31 csky_dct4_sR_q31_len512; - extern csky_dct4_instance_q31 csky_dct4_sR_q31_len2048; - extern csky_dct4_instance_q31 csky_dct4_sR_q31_len8192; - - extern csky_dct4_instance_f32 csky_dct4_sR_f32_len128; - extern csky_dct4_instance_f32 csky_dct4_sR_f32_len512; - extern csky_dct4_instance_f32 csky_dct4_sR_f32_len2048; - extern csky_dct4_instance_f32 csky_dct4_sR_f32_len8192; -#endif diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_math.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_math.h deleted file mode 100644 index d7adfecb..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_math.h +++ /dev/null @@ -1,4637 +0,0 @@ -/* - * Copyright (C) 2016-2019 C-SKY Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file csky_math.h - * @brief Public header file for CSI DSP Library. - * @version V1.0 - * @date 20. Dec 2016 - ******************************************************************************/ - - -/** - * @defgroup groupMath Basic Math Functions - */ - -/** - * @defgroup groupFastMath Fast Math Functions - * This set of functions provides a fast approximation to sine, cosine, and square root. - * As compared to most of the other functions in the CSI math library, the fast math functions - * operate on individual values and not arrays. - * There are separate functions for Q15, Q31, and floating-point data. - * - */ - -/** - * @defgroup groupCmplxMath Complex Math Functions - * This set of functions operates on complex data vectors. - * The data in the complex arrays is stored in an interleaved fashion - * (real, imag, real, imag, ...). - * In the API functions, the number of samples in a complex array refers - * to the number of complex values; the array contains twice this number of - * real values. - */ - -/** - * @defgroup groupFilters Filtering Functions - */ - -/** - * @defgroup groupMatrix Matrix Functions - * - * This set of functions provides basic matrix math operations. - * The functions operate on matrix data structures. For example, - * the type - * definition for the floating-point matrix structure is shown - * below: - * <pre> - * typedef struct - * { - * uint16_t numRows; // number of rows of the matrix. - * uint16_t numCols; // number of columns of the matrix. - * float32_t *pData; // points to the data of the matrix. - * } csky_matrix_instance_f32; - * </pre> - * There are similar definitions for Q15 and Q31 data types. - * - * The structure specifies the size of the matrix and then points to - * an array of data. The array is of size <code>numRows X numCols</code> - * and the values are arranged in row order. That is, the - * matrix element (i, j) is stored at: - * <pre> - * pData[i*numCols + j] - * </pre> - * - * \par Init Functions - * There is an associated initialization function for each type of matrix - * data structure. - * The initialization function sets the values of the internal structure fields. - * Refer to the function <code>csky_mat_init_f32()</code>, <code>csky_mat_init_q31()</code> - * and <code>csky_mat_init_q15()</code> for floating-point, Q31 and Q15 types, respectively. - * - * \par - * Use of the initialization function is optional. However, if initialization function is used - * then the instance structure cannot be placed into a const data section. - * To place the instance structure in a const data - * section, manually initialize the data structure. For example: - * <pre> - * <code>csky_matrix_instance_f32 S = {nRows, nColumns, pData};</code> - * <code>csky_matrix_instance_q31 S = {nRows, nColumns, pData};</code> - * <code>csky_matrix_instance_q15 S = {nRows, nColumns, pData};</code> - * </pre> - * where <code>nRows</code> specifies the number of rows, <code>nColumns</code> - * specifies the number of columns, and <code>pData</code> points to the - * data array. - * - * \par Size Checking - * By default all of the matrix functions perform size checking on the input and - * output matrices. For example, the matrix addition function verifies that the - * two input matrices and the output matrix all have the same number of rows and - * columns. If the size check fails the functions return: - * <pre> - * CSKY_MATH_SIZE_MISMATCH - * </pre> - * Otherwise the functions return - * <pre> - * CSKY_MATH_SUCCESS - * </pre> - * There is some overhead associated with this matrix size checking. - * The matrix size checking is enabled via the \#define - * <pre> - * CSKY_MATH_MATRIX_CHECK - * </pre> - * within the library project settings. By default this macro is defined - * and size checking is enabled. By changing the project settings and - * undefining this macro size checking is eliminated and the functions - * run a bit faster. With size checking disabled the functions always - * return <code>CSKY_MATH_SUCCESS</code>. - */ - -/** - * @defgroup groupTransforms Transform Functions - */ - -/** - * @defgroup groupController Controller Functions - */ - -/** - * @defgroup groupStats Statistics Functions - */ -/** - * @defgroup groupSupport Support Functions - */ - -/** - * @defgroup groupInterpolation Interpolation Functions - * These functions perform 1- and 2-dimensional interpolation of data. - * Linear interpolation is used for 1-dimensional data and - * bilinear interpolation is used for 2-dimensional data. - */ - - -/** - * @defgroup groupYunvoice Yunvoice Functions - * These functions are designed for Yunvoice project, which are modified - * according to the CEVA DSP functions. So, one can porting the software - * from CEVA to CSKY straightforwardly. - */ - -/** - * @defgroup groupExamples Examples - */ - - -#ifndef _CSKY_MATH_H -#define _CSKY_MATH_H - -#define __CSI_GENERIC /* disable NVIC and Systick functions */ - -#include "csi_core.h" - -#include <float.h> -#undef __CSI_GENERIC /* enable NVIC and Systick functions */ -#include "string.h" -#include "math.h" -#ifdef __cplusplus -extern "C" -{ -#endif - - - /** - * @brief Macros required for reciprocal calculation in Normalized LMS - */ - -#define DELTA_Q31 (0x100) -#define DELTA_Q15 0x5 -#define INDEX_MASK 0x0000003F -#ifndef PI -#define PI 3.14159265358979f -#endif - - /** - * @brief Macros required for SINE and COSINE Fast math approximations - */ - -#define FAST_MATH_TABLE_SIZE 512 -#define FAST_MATH_Q31_SHIFT (32 - 10) -#define FAST_MATH_Q15_SHIFT (16 - 10) -#define CONTROLLER_Q31_SHIFT (32 - 9) -#define TABLE_SIZE 256 -#define TABLE_SPACING_Q31 0x400000 -#define TABLE_SPACING_Q15 0x80 - - /** - * @brief Macros required for SINE and COSINE Controller functions - */ - /* 1.31(q31) Fixed value of 2/360 */ - /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ -#define INPUT_SPACING 0xB60B61 - - /** - * @brief Macro for Unaligned Support - */ -#ifndef UNALIGNED_SUPPORT_DISABLE - #define ALIGN4 -#else - #define ALIGN4 __attribute__((aligned(4))) -#endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ - -__ALWAYS_STATIC_INLINE int32_t __SSAT_31(int32_t x) -{ - int32_t res = x; - if (x > 0x3fffffff) { - res = 0x3fffffff; - } else if (x < -1073741824) { - res = -1073741824; - } - - return res; -} - -__ALWAYS_STATIC_INLINE int32_t __SSAT_16(int32_t x) -{ - int32_t res = x; - if (x > 0x7fff) { - res = 0x7fff; - } else if (x < -32768) { - res = -32768; - } - - return res; -} - -__ALWAYS_STATIC_INLINE int32_t __SSAT_8(int32_t x) -{ - int32_t res = x; - if (x > 0x7f) { - res = 0x7f; - } else if (x < -128) { - res = -128; - } - - return res; -} - -#ifdef CSKY_SIMD -/* SMMLAR */ -__ALWAYS_STATIC_INLINE int32_t multAcc_32x32_keep32_R(int32_t a, int32_t x, int32_t y) -{ - __ASM volatile("mula.s32.rhs %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y) : "0" (a), "1" (x), "2" (y)); - return a; -} - -/* SMMLSR */ -__ALWAYS_STATIC_INLINE int32_t multSub_32x32_keep32_R(int32_t a, int32_t x, int32_t y) -{ - __ASM volatile("muls.s32.rhs %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -/* SMMULR */ -__ALWAYS_STATIC_INLINE int32_t mult_32x32_keep32_R(int32_t x, int32_t y) -{ - int32_t a; - __ASM volatile("mul.s32.rh %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "1" (x), "2" (y)); - return a; -} - -/* SMMLA */ -__ALWAYS_STATIC_INLINE int32_t multAcc_32x32_keep32(int32_t a, int32_t x, int32_t y) -{ - __ASM volatile("mula.s32.hs %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -/* SMMLS */ -__ALWAYS_STATIC_INLINE int32_t multSub_32x32_keep32(int32_t a, int32_t x, int32_t y) -{ - __ASM volatile("muls.s32.hs %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -/* SMMUL */ -__ALWAYS_STATIC_INLINE int32_t mult_32x32_keep32(int32_t x, int32_t y) -{ - int32_t a; - __ASM volatile("mul.s32.h %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int32_t multAcc_16x16_keep32(int32_t a, int16_t x, int16_t y) -{ - __ASM volatile("mulall.s16 %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int64_t multAcc_16x16_keep64(int64_t a, int16_t x, int16_t y) -{ - __ASM volatile("mulall.s16.e %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int64_t mult_32x32_keep64(int32_t x, int32_t y) -{ - int64_t a; - __ASM volatile("mul.s32 %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int64_t multAcc_32x32_keep64(int64_t a, int32_t x, int32_t y) -{ - __ASM volatile("mula.s32 %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "0" (a), "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int32_t mult_32x32_dext_31(int32_t x, int32_t y) -{ - int64_t tmp1; - int32_t tmp2; - __ASM volatile("mul.s32 %0, %1, %2\n\t" - "dexti %3, %0, %R0, 31" - :"=r" (tmp1), "=r" (x), "=r" (y), "=r" (tmp2): "1" (x), "2" (y)); - return tmp2; -} - -__ALWAYS_STATIC_INLINE int32_t mult_32x32_dext_30(int32_t x, int32_t y) -{ - int64_t tmp1; - int32_t tmp2; - __ASM volatile("mul.s32 %0, %1, %2\n\t" - "dexti %3, %0, %R0, 30" - :"=r" (tmp1), "=r" (x), "=r" (y), "=r" (tmp2): "1" (x), "2" (y)); - return tmp2; -} - -__ALWAYS_STATIC_INLINE int32_t mult_32x32_dext_4(int32_t x, int32_t y) -{ - int64_t tmp1; - int32_t tmp2; - __ASM volatile("mul.s32 %0, %1, %2\n\t" - "dexti %3, %0, %R0, 4" - :"=r" (tmp1), "=r" (x), "=r" (y), "=r" (tmp2): "1" (x), "2" (y)); - return tmp2; -} - -__ALWAYS_STATIC_INLINE int32_t mult_32x32_dext_33(int32_t x, int32_t y) -{ - int64_t tmp1; - int32_t tmp2; - __ASM volatile("mul.s32 %0, %1, %2\n\t" - "asri %3, %R0, 1" - :"=r" (tmp1), "=r" (x), "=r" (y), "=r" (tmp2): "1" (x), "2" (y)); - return tmp2; -} - -__ALWAYS_STATIC_INLINE int32_t dext_31(int64_t x) -{ - int32_t tmp1; - __ASM volatile( - "dexti %0, %1, %R1, 31" - :"=r" (tmp1), "=r" (x) : "1" (x)); - return tmp1; -} - -__ALWAYS_STATIC_INLINE int32_t mult_l16xl16_keep32(int32_t x, int32_t y) -{ - int32_t a; - __ASM volatile("mulll.s16 %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int32_t mult_h16xl16_keep32(int32_t x, int32_t y) -{ - int32_t a; - __ASM volatile("mulhl.s16 %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "1" (x), "2" (y)); - return a; -} - -__ALWAYS_STATIC_INLINE int32_t mult_h16xh16_keep32(int32_t x, int32_t y) -{ - int32_t a; - __ASM volatile("mulhh.s16 %0, %1, %2\n\t" - :"=r" (a), "=r" (x), "=r" (y): "1" (x), "2" (y)); - return a; -} - -#endif - - - /** - * @brief Error status returned by some functions in the library. - */ - - typedef enum - { - CSKY_MATH_SUCCESS = 0, /**< No error */ - CSKY_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ - CSKY_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ - CSKY_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ - CSKY_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ - CSKY_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ - CSKY_MATH_TEST_FAILURE = -6 /**< Test Failed */ - } csky_status; - - /** - * @brief 8-bit fractional data type in 1.7 format. - */ - typedef int8_t q7_t; - - /** - * @brief 16-bit fractional data type in 1.15 format. - */ - typedef int16_t q15_t; - - /** - * @brief 32-bit fractional data type in 1.31 format. - */ - typedef int32_t q31_t; - - /** - * @brief 64-bit fractional data type in 1.63 format. - */ - typedef int64_t q63_t; - - /** - * @brief 32-bit floating-point type definition. - */ - typedef float float32_t; - - /** - * @brief 64-bit floating-point type definition. - */ - typedef double float64_t; - - /** - * @brief 32-bit fractional complex data type in 1.31 format. - */ - typedef struct - { - q31_t re; - q31_t im; - } cq31_t; - /** - * @brief 16-bit fractional complex data type in 1.15 format. - */ - typedef struct - { - q15_t re; - q15_t im; - } cq15_t; - /** - * @brief definition to read/write two 16 bit values. - */ - #define __SIMD32_TYPE int32_t - #define CSI_UNUSED __attribute__((unused)) - -#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) -#define __SIMD32_CONST(addr) ((__SIMD32_TYPE *)(addr)) -#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE *) (addr)) -#define __SIMD64(addr) (*(int64_t **) & (addr)) - -#if defined (CSKY_MATH_NO_SIMD) - /** - * @brief definition to pack two 16 bit values. - */ -#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ - (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) -#define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ - (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) - -#endif - - - /** - * @brief definition to pack four 8 bit values. - */ -#ifndef CSKY_MATH_BIG_ENDIAN - -#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) -#else - -#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) - -#endif - - /** - * @brief Clips Q63 to Q31 values. - */ - static __INLINE q31_t clip_q63_to_q31( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; - } - - /** - * @brief Instance structure for the Q7 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } csky_fir_instance_q7; - - /** - * @brief Instance structure for the Q15 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } csky_fir_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } csky_fir_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } csky_fir_instance_f32; - - void csky_fir_q7( - const csky_fir_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - void csky_fir_init_q7( - csky_fir_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - uint32_t blockSize); - - void csky_fir_q15( - const csky_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_fir_fast_q15( - const csky_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - csky_status csky_fir_init_q15( - csky_fir_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - void csky_fir_q31( - const csky_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_fir_fast_q31( - const csky_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_fir_init_q31( - csky_fir_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - void csky_fir_f32( - const csky_fir_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_fir_init_f32( - csky_fir_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 Biquad cascade filter. - */ - typedef struct - { - int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - } csky_biquad_casd_df1_inst_q15; - - /** - * @brief Instance structure for the Q31 Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - } csky_biquad_casd_df1_inst_q31; - - /** - * @brief Instance structure for the Q31 Biquad cascade filter. - */ - - /** - * @brief Instance structure for the floating-point Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - } csky_biquad_casd_df1_inst_f32; - - void csky_biquad_cascade_df1_q15( - const csky_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_biquad_cascade_df1_init_q15( - csky_biquad_casd_df1_inst_q15 * S, - uint8_t numStages, - q15_t * pCoeffs, - q15_t * pState, - int8_t postShift); - - void csky_biquad_cascade_df1_fast_q15( - const csky_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_biquad_cascade_df1_q31( - const csky_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_biquad_cascade_df1_fast_q31( - const csky_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_biquad_cascade_df1_init_q31( - csky_biquad_casd_df1_inst_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q31_t * pState, - int8_t postShift); - - void csky_biquad_cascade_df1_f32( - const csky_biquad_casd_df1_inst_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_biquad_cascade_df1_init_f32( - csky_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Instance structure for the floating-point matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float32_t *pData; /**< points to the data of the matrix. */ - } csky_matrix_instance_f32; - - - /** - * @brief Instance structure for the floating-point matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float64_t *pData; /**< points to the data of the matrix. */ - } csky_matrix_instance_f64; - - /** - * @brief Instance structure for the Q15 matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q15_t *pData; /**< points to the data of the matrix. */ - } csky_matrix_instance_q15; - - /** - * @brief Instance structure for the Q31 matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q31_t *pData; /**< points to the data of the matrix. */ - } csky_matrix_instance_q31; - - csky_status csky_mat_add_f32( - const csky_matrix_instance_f32 * pSrcA, - const csky_matrix_instance_f32 * pSrcB, - csky_matrix_instance_f32 * pDst); - - csky_status csky_mat_add_q15( - const csky_matrix_instance_q15 * pSrcA, - const csky_matrix_instance_q15 * pSrcB, - csky_matrix_instance_q15 * pDst); - - csky_status csky_mat_add_q31( - const csky_matrix_instance_q31 * pSrcA, - const csky_matrix_instance_q31 * pSrcB, - csky_matrix_instance_q31 * pDst); - - csky_status csky_mat_cmplx_mult_f32( - const csky_matrix_instance_f32 * pSrcA, - const csky_matrix_instance_f32 * pSrcB, - csky_matrix_instance_f32 * pDst); - - csky_status csky_mat_cmplx_mult_q15( - const csky_matrix_instance_q15 * pSrcA, - const csky_matrix_instance_q15 * pSrcB, - csky_matrix_instance_q15 * pDst); - - csky_status csky_mat_cmplx_mult_q31( - const csky_matrix_instance_q31 * pSrcA, - const csky_matrix_instance_q31 * pSrcB, - csky_matrix_instance_q31 * pDst); - - csky_status csky_mat_trans_f32( - const csky_matrix_instance_f32 * pSrc, - csky_matrix_instance_f32 * pDst); - - csky_status csky_mat_trans_q15( - const csky_matrix_instance_q15 * pSrc, - csky_matrix_instance_q15 * pDst); - - csky_status csky_mat_trans_q31( - const csky_matrix_instance_q31 * pSrc, - csky_matrix_instance_q31 * pDst); - - csky_status csky_mat_mult_f32( - const csky_matrix_instance_f32 * pSrcA, - const csky_matrix_instance_f32 * pSrcB, - csky_matrix_instance_f32 * pDst); - - csky_status csky_mat_mult_q15( - const csky_matrix_instance_q15 * pSrcA, - const csky_matrix_instance_q15 * pSrcB, - csky_matrix_instance_q15 * pDst); - - csky_status csky_mat_mult_fast_q15( - const csky_matrix_instance_q15 * pSrcA, - const csky_matrix_instance_q15 * pSrcB, - csky_matrix_instance_q15 * pDst); - - csky_status csky_mat_mult_q31( - const csky_matrix_instance_q31 * pSrcA, - const csky_matrix_instance_q31 * pSrcB, - csky_matrix_instance_q31 * pDst); - - csky_status csky_mat_mult_trans_q31( - const csky_matrix_instance_q31 * pSrcA, - const csky_matrix_instance_q31 * pSrcB, - csky_matrix_instance_q31 * pDst); - - csky_status csky_mat_mult_fast_q31( - const csky_matrix_instance_q31 * pSrcA, - const csky_matrix_instance_q31 * pSrcB, - csky_matrix_instance_q31 * pDst); - - csky_status csky_mat_sub_f32( - const csky_matrix_instance_f32 * pSrcA, - const csky_matrix_instance_f32 * pSrcB, - csky_matrix_instance_f32 * pDst); - - csky_status csky_mat_sub_q15( - const csky_matrix_instance_q15 * pSrcA, - const csky_matrix_instance_q15 * pSrcB, - csky_matrix_instance_q15 * pDst); - - csky_status csky_mat_sub_q31( - const csky_matrix_instance_q31 * pSrcA, - const csky_matrix_instance_q31 * pSrcB, - csky_matrix_instance_q31 * pDst); - - csky_status csky_mat_scale_f32( - const csky_matrix_instance_f32 * pSrc, - float32_t scale, - csky_matrix_instance_f32 * pDst); - - csky_status csky_mat_scale_q15( - const csky_matrix_instance_q15 * pSrc, - q15_t scaleFract, - int32_t shift, - csky_matrix_instance_q15 * pDst); - - csky_status csky_mat_scale_q31( - const csky_matrix_instance_q31 * pSrc, - q31_t scaleFract, - int32_t shift, - csky_matrix_instance_q31 * pDst); - - void csky_mat_init_q31( - csky_matrix_instance_q31 * S, - uint16_t nRows, - uint16_t nColumns, - q31_t * pData); - - void csky_mat_init_q15( - csky_matrix_instance_q15 * S, - uint16_t nRows, - uint16_t nColumns, - q15_t * pData); - - void csky_mat_init_f32( - csky_matrix_instance_f32 * S, - uint16_t nRows, - uint16_t nColumns, - float32_t * pData); - - /** - * @brief Instance structure for the Q15 PID Control. - */ - typedef struct - { - q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - q15_t A1; - q15_t A2; - q15_t state[3]; /**< The state array of length 3. */ - q15_t Kp; /**< The proportional gain. */ - q15_t Ki; /**< The integral gain. */ - q15_t Kd; /**< The derivative gain. */ - } csky_pid_instance_q15; - - /** - * @brief Instance structure for the Q31 PID Control. - */ - typedef struct - { - q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - q31_t A2; /**< The derived gain, A2 = Kd . */ - q31_t state[3]; /**< The state array of length 3. */ - q31_t Kp; /**< The proportional gain. */ - q31_t Ki; /**< The integral gain. */ - q31_t Kd; /**< The derivative gain. */ - } csky_pid_instance_q31; - - /** - * @brief Instance structure for the floating-point PID Control. - */ - typedef struct - { - float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - float32_t A2; /**< The derived gain, A2 = Kd . */ - float32_t state[3]; /**< The state array of length 3. */ - float32_t Kp; /**< The proportional gain. */ - float32_t Ki; /**< The integral gain. */ - float32_t Kd; /**< The derivative gain. */ - } csky_pid_instance_f32; - - void csky_pid_init_f32( - csky_pid_instance_f32 * S, - int32_t resetStateFlag); - - void csky_pid_reset_f32( - csky_pid_instance_f32 * S); - - void csky_pid_init_q31( - csky_pid_instance_q31 * S, - int32_t resetStateFlag); - - void csky_pid_reset_q31( - csky_pid_instance_q31 * S); - - void csky_pid_init_q15( - csky_pid_instance_q15 * S, - int32_t resetStateFlag); - - void csky_pid_reset_q15( - csky_pid_instance_q15 * S); - - - /** - * @brief Instance structure for the floating-point Linear Interpolate function. - */ - typedef struct - { - uint32_t nValues; /**< nValues */ - float32_t x1; /**< x1 */ - float32_t xSpacing; /**< xSpacing */ - float32_t *pYData; /**< pointer to the table of Y values */ - } csky_linear_interp_instance_f32; - - /** - * @brief Instance structure for the floating-point bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - float32_t *pData; /**< points to the data table. */ - } csky_bilinear_interp_instance_f32; - - /** - * @brief Instance structure for the Q31 bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q31_t *pData; /**< points to the data table. */ - } csky_bilinear_interp_instance_q31; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q15_t *pData; /**< points to the data table. */ - } csky_bilinear_interp_instance_q15; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q7_t *pData; /**< points to the data table. */ - } csky_bilinear_interp_instance_q7; - - void csky_mult_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - void csky_mult_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - void csky_mult_rnd_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - void csky_mult_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - void csky_mult_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } csky_cfft_radix2_instance_q15; - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } csky_cfft_radix4_instance_q15; - - /** - * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } csky_cfft_radix2_instance_q31; - - /** - * @brief Instance structure for the Q31 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } csky_cfft_radix4_instance_q31; - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } csky_cfft_radix2_instance_f32; - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } csky_cfft_radix4_instance_f32; - - /** - * @brief Instance structure for the fixed-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } csky_cfft_instance_q15; - -void csky_cfft_q15( - const csky_cfft_instance_q15 * S, - q15_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the fixed-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } csky_cfft_instance_q31; - -void csky_cfft_q31( - const csky_cfft_instance_q31 * S, - q31_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } csky_cfft_instance_f32; - - void csky_cfft_f32( - const csky_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the Q15 RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const csky_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } csky_rfft_instance_q15; - - csky_status csky_rfft_init_q15( - csky_rfft_instance_q15 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void csky_rfft_q15( - const csky_rfft_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst); - - /** - * @brief Instance structure for the Q31 RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const csky_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } csky_rfft_instance_q31; - - csky_status csky_rfft_init_q31( - csky_rfft_instance_q31 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void csky_rfft_q31( - const csky_rfft_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst); - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint16_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - csky_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } csky_rfft_instance_f32; - - csky_status csky_rfft_init_f32( - csky_rfft_instance_f32 * S, - csky_cfft_radix4_instance_f32 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void csky_rfft_f32( - const csky_rfft_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst); - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ -typedef struct - { - csky_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ - uint16_t fftLenRFFT; /**< length of the real sequence */ - float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ - } csky_rfft_fast_instance_f32 ; - -csky_status csky_rfft_fast_init_f32 ( - csky_rfft_fast_instance_f32 * S, - uint16_t fftLen); - -void csky_rfft_fast_f32( - csky_rfft_fast_instance_f32 * S, - float32_t * p, float32_t * pOut, - uint8_t ifftFlag); - - /** - * @brief Instance structure for the floating-point DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - float32_t normalize; /**< normalizing factor. */ - float32_t *pTwiddle; /**< points to the twiddle factor table. */ - float32_t *pCosFactor; /**< points to the cosFactor table. */ - csky_rfft_fast_instance_f32 *pRfft; /**< points to the real FFT fast instance. */ - csky_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } csky_dct4_instance_f32; - - csky_status csky_dct4_init_f32( - csky_dct4_instance_f32 * S, - csky_rfft_fast_instance_f32 * S_RFFT, - csky_cfft_radix4_instance_f32 * S_CFFT, - uint16_t N, - uint16_t Nby2, - float32_t normalize); - - void csky_dct4_f32( - const csky_dct4_instance_f32 * S, - float32_t * pState, - float32_t * pInlineBuffer); - - - /** - * @brief Instance structure for the Q31 DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q31_t normalize; /**< normalizing factor. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - q31_t *pCosFactor; /**< points to the cosFactor table. */ - csky_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ - csky_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } csky_dct4_instance_q31; - - csky_status csky_dct4_init_q31( - csky_dct4_instance_q31 * S, - csky_rfft_instance_q31 * S_RFFT, - csky_cfft_radix4_instance_q31 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q31_t normalize); - - void csky_dct4_q31( - const csky_dct4_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - - /** - * @brief Instance structure for the Q15 DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q15_t normalize; /**< normalizing factor. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - q15_t *pCosFactor; /**< points to the cosFactor table. */ - csky_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ - csky_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } csky_dct4_instance_q15; - - csky_status csky_dct4_init_q15( - csky_dct4_instance_q15 * S, - csky_rfft_instance_q15 * S_RFFT, - csky_cfft_radix4_instance_q15 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q15_t normalize); - - void csky_dct4_q15( - const csky_dct4_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer); - - void csky_add_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - void csky_add_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - void csky_add_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - void csky_add_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - void csky_sub_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - void csky_sub_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - void csky_sub_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - void csky_sub_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - void csky_scale_f32( - float32_t * pSrc, - float32_t scale, - float32_t * pDst, - uint32_t blockSize); - - void csky_scale_q7( - q7_t * pSrc, - q7_t scaleFract, - int8_t shift, - q7_t * pDst, - uint32_t blockSize); - - void csky_scale_q15( - q15_t * pSrc, - q15_t scaleFract, - int8_t shift, - q15_t * pDst, - uint32_t blockSize); - - void csky_scale_q31( - q31_t * pSrc, - q31_t scaleFract, - int8_t shift, - q31_t * pDst, - uint32_t blockSize); - - void csky_abs_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - void csky_abs_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_abs_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_abs_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_abs_max_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_abs_max_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - void csky_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t blockSize, - float32_t * result); - - void csky_dot_prod_q7( - q7_t * pSrcA, - q7_t * pSrcB, - uint32_t blockSize, - q31_t * result); - - void csky_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - void csky_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - void csky_shift_q7( - q7_t * pSrc, - int8_t shiftBits, - q7_t * pDst, - uint32_t blockSize); - - void csky_shift_q15( - q15_t * pSrc, - int8_t shiftBits, - q15_t * pDst, - uint32_t blockSize); - - void csky_shift_q31( - q31_t * pSrc, - int8_t shiftBits, - q31_t * pDst, - uint32_t blockSize); - - void csky_offset_f32( - float32_t * pSrc, - float32_t offset, - float32_t * pDst, - uint32_t blockSize); - - void csky_offset_q7( - q7_t * pSrc, - q7_t offset, - q7_t * pDst, - uint32_t blockSize); - - void csky_offset_q15( - q15_t * pSrc, - q15_t offset, - q15_t * pDst, - uint32_t blockSize); - - void csky_offset_q31( - q31_t * pSrc, - q31_t offset, - q31_t * pDst, - uint32_t blockSize); - - void csky_negate_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_negate_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - void csky_negate_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_negate_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_copy_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_copy_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - void csky_copy_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_copy_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_fill_f32( - float32_t value, - float32_t * pDst, - uint32_t blockSize); - - void csky_fill_q7( - q7_t value, - q7_t * pDst, - uint32_t blockSize); - - void csky_fill_q15( - q15_t value, - q15_t * pDst, - uint32_t blockSize); - - void csky_fill_q31( - q31_t value, - q31_t * pDst, - uint32_t blockSize); - - void csky_conv_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - void csky_conv_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - void csky_conv_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - void csky_conv_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - void csky_conv_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - void csky_conv_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - void csky_conv_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - void csky_conv_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - void csky_conv_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - csky_status csky_conv_partial_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - csky_status csky_conv_partial_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - csky_status csky_conv_partial_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - csky_status csky_conv_partial_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - csky_status csky_conv_partial_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - csky_status csky_conv_partial_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - csky_status csky_conv_partial_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - csky_status csky_conv_partial_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - csky_status csky_conv_partial_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - /** - * functions for the yunVoice functions. - */ - q15_t csky_dsp_lib_vec_max_abs16( - q15_t * A, - uint32_t N); - - q31_t csky_dsp_lib_vec_max_abs32( - q31_t * A, - uint32_t N); - - void csky_dsp_lib_vec_abs16( - q15_t * A, - uint32_t N, - q15_t * C); - - void csky_dsp_lib_vec_abs32( - q31_t * A, - uint32_t N, - q31_t * C); - - void csky_dsp_lib_vec_add16( - q15_t * A, - q15_t * B, - uint32_t N, - q15_t * C); - - void csky_dsp_lib_vec_add32( - q31_t * A, - q31_t * B, - uint32_t N, - q31_t * C); - - void csky_dsp_lib_vec_cx_conj_q15( - q15_t * A, - uint32_t N, - q15_t * B); - - void csky_dsp_lib_vec_cx_conj_q31( - q31_t * A, - uint32_t N, - q31_t * C); - - q31_t csky_dsp_lib_vec_dot_q15( - q15_t * A, - q15_t * B, - uint32_t N); - - q31_t csky_dsp_lib_vec_dot_q31( - q31_t * A, - q31_t * B, - uint32_t N); - - void csky_dsp_lib_mat_cx_add16( - cq15_t * A, - cq15_t * B, - uint32_t N, - uint32_t M, - cq15_t * C); - - void csky_dsp_lib_mat_cx_add32( - cq31_t * A, - cq31_t * B, - uint32_t N, - uint32_t M, - cq31_t * C); - - void csky_dsp_lib_mat_cx_mul_q15( - cq15_t * A, - cq15_t * B, - uint32_t N, - uint32_t M, - uint32_t L, - cq15_t * C); - - void csky_dsp_lib_mat_cx_mul_q31( - cq31_t * A, - cq31_t * B, - uint32_t N, - uint32_t M, - uint32_t L, - cq31_t * C); - - void csky_dsp_lib_mat_cx_sub16( - cq15_t * A, - cq15_t * B, - uint32_t N, - uint32_t M, - cq15_t * C); - - void csky_dsp_lib_mat_cx_sub32( - cq31_t * A, - cq31_t * B, - uint32_t N, - uint32_t M, - cq31_t * C); - - void csky_dsp_lib_vec_mul_q15( - q15_t * A, - q15_t * B, - uint32_t N, - q15_t * C); - - void csky_dsp_lib_vec_mul_q31( - q31_t * A, - q31_t * B, - uint32_t N, - q31_t * C); - - q31_t csky_dsp_lib_pow_int32( - q31_t arg_in_x, - q15_t arg_exp_in_x, - q31_t arg_in_y, - q15_t arg_exp_in_y, - q31_t *arg_exp_out); - - void csky_dsp_lib_vec_scale_q15( - q15_t * A, - q15_t scaleFract, - int8_t shift, - q15_t * B, - uint32_t N); - - void csky_dsp_lib_vec_scale_q31( - q31_t * A, - q31_t scaleFract, - int8_t shift, - q31_t * B, - uint32_t N); - - void csky_dsp_lib_vec_shf16( - q15_t * A, - int8_t shift_val, - uint32_t N, - q15_t * C); - - void csky_dsp_lib_vec_shf32( - q31_t * A, - q31_t shift_val, - uint32_t N, - q31_t * C); - - q15_t csky_dsp_lib_sqrt_int32( - q31_t x, - uint32_t rnd_flag); - - void csky_dsp_lib_vec_sub16( - q15_t * A, - q15_t * B, - uint32_t N, - q15_t * C); - - void csky_dsp_lib_vec_sub32( - q31_t * A, - q31_t * B, - uint32_t N, - q31_t * C); - - q63_t csky_dsp_lib_vec_sum16( - q15_t * A, - uint32_t N); - - q63_t csky_dsp_lib_vec_sum32( - q31_t * A, - uint32_t N); - - void csky_fft_lib_cx16_fft( - q31_t log2_buf_len, - q15_t * in_buf, - q15_t * out_buf, - const q15_t * twi_table, - const uint16_t * bitrev_tbl, - q15_t * temp_buf, - q7_t * ScaleShift, - q31_t br); - - void csky_fft_lib_cx32_fft( - q31_t log2_buf_len, - q31_t * in_buf, - q31_t * out_buf, - const q31_t * twi_table, - const uint16_t * bitrev_tbl, - q31_t * temp_buf, - q31_t br); - - void csky_fft_lib_cx16_ifft( - q31_t log2_buf_len, - q15_t * in_buf, - q15_t * out_buf, - const q15_t * twi_table, - const uint16_t * bitrev_tbl, - q15_t * temp_buf, - q7_t * ScaleShift, - q31_t br); - - void csky_fft_lib_cx32_ifft( - q31_t log2_buf_len, - q31_t * in_buf, - q31_t * out_buf, - const q31_t * twi_table, - const uint16_t * bitrev_tbl, - q31_t * temp_buf, - q31_t br); - - void csky_fft_lib_int16_fft( - q31_t log2_buf_len, - q15_t * in_buf, - q15_t * out_buf, - const q15_t * twi_table, - const q15_t * last_stage_twi_table, - const uint16_t * bitrev_tbl, - q15_t * temp_buf, - q7_t * ScaleShift, - q31_t br); - - void csky_fft_lib_int32_fft( - q31_t log2_buf_len, - q31_t * in_buf, - q31_t * out_buf, - const q31_t * twi_table, - const q31_t * last_stage_twi_table, - const uint16_t * bitrev_tbl, - q31_t * temp_buf, - q31_t br); - - void csky_fft_lib_int16_ifft( - q31_t log2_buf_len, - q15_t * in_buf, - q15_t * out_buf, - const q15_t * twi_table, - const q15_t * last_stage_twi_table, - const uint16_t * bitrev_tbl, - q15_t * temp_buf, - q7_t * ScaleShift, - q31_t br); - - void csky_fft_lib_int32_ifft( - q31_t log2_buf_len, - q31_t * in_buf, - q31_t * out_buf, - const q31_t * twi_table, - const q31_t * last_stage_twi_table, - const uint16_t * bitrev_tbl, - q31_t * temp_buf, - q31_t br); - - /** - * @brief Instance structure for the Q15 FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } csky_fir_decimate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } csky_fir_decimate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } csky_fir_decimate_instance_f32; - - void csky_fir_decimate_f32( - const csky_fir_decimate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - csky_status csky_fir_decimate_init_f32( - csky_fir_decimate_instance_f32 * S, - uint16_t numTaps, - uint8_t M, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - void csky_fir_decimate_q15( - const csky_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_fir_decimate_fast_q15( - const csky_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - csky_status csky_fir_decimate_init_q15( - csky_fir_decimate_instance_q15 * S, - uint16_t numTaps, - uint8_t M, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - void csky_fir_decimate_q31( - const csky_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_fir_decimate_fast_q31( - csky_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - csky_status csky_fir_decimate_init_q31( - csky_fir_decimate_instance_q31 * S, - uint16_t numTaps, - uint8_t M, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } csky_fir_interpolate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } csky_fir_interpolate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ - } csky_fir_interpolate_instance_f32; - - void csky_fir_interpolate_q15( - const csky_fir_interpolate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - csky_status csky_fir_interpolate_init_q15( - csky_fir_interpolate_instance_q15 * S, - uint8_t L, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - void csky_fir_interpolate_q31( - const csky_fir_interpolate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - csky_status csky_fir_interpolate_init_q31( - csky_fir_interpolate_instance_q31 * S, - uint8_t L, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - void csky_fir_interpolate_f32( - const csky_fir_interpolate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - csky_status csky_fir_interpolate_init_f32( - csky_fir_interpolate_instance_f32 * S, - uint8_t L, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the high precision Q31 Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ - } csky_biquad_cas_df1_32x64_ins_q31; - - void csky_biquad_cas_df1_32x64_q31( - const csky_biquad_cas_df1_32x64_ins_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_biquad_cas_df1_32x64_init_q31( - csky_biquad_cas_df1_32x64_ins_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q63_t * pState, - uint8_t postShift); - - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } csky_biquad_cascade_df2T_instance_f32; - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } csky_biquad_cascade_stereo_df2T_instance_f32; - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float64_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - float64_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } csky_biquad_cascade_df2T_instance_f64; - - void csky_biquad_cascade_df2T_f32( - const csky_biquad_cascade_df2T_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_biquad_cascade_stereo_df2T_f32( - const csky_biquad_cascade_stereo_df2T_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_biquad_cascade_df2T_f64( - const csky_biquad_cascade_df2T_instance_f64 * S, - float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); - - void csky_biquad_cascade_df2T_init_f32( - csky_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - void csky_biquad_cascade_stereo_df2T_init_f32( - csky_biquad_cascade_stereo_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - void csky_biquad_cascade_df2T_init_f64( - csky_biquad_cascade_df2T_instance_f64 * S, - uint8_t numStages, - float64_t * pCoeffs, - float64_t * pState); - - - /** - * @brief Instance structure for the Q15 FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } csky_fir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } csky_fir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } csky_fir_lattice_instance_f32; - - void csky_fir_lattice_init_q15( - csky_fir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pCoeffs, - q15_t * pState); - - void csky_fir_lattice_q15( - const csky_fir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_fir_lattice_init_q31( - csky_fir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pCoeffs, - q31_t * pState); - - void csky_fir_lattice_q31( - const csky_fir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_fir_lattice_init_f32( - csky_fir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - void csky_fir_lattice_f32( - const csky_fir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } csky_iir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } csky_iir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } csky_iir_lattice_instance_f32; - - void csky_iir_lattice_f32( - const csky_iir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_iir_lattice_init_f32( - csky_iir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pkCoeffs, - float32_t * pvCoeffs, - float32_t * pState, - uint32_t blockSize); - - void csky_iir_lattice_q31( - const csky_iir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_iir_lattice_init_q31( - csky_iir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pkCoeffs, - q31_t * pvCoeffs, - q31_t * pState, - uint32_t blockSize); - - void csky_iir_lattice_q15( - const csky_iir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_iir_lattice_init_q15( - csky_iir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pkCoeffs, - q15_t * pvCoeffs, - q15_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the floating-point LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that controls filter coefficient updates. */ - } csky_lms_instance_f32; - - void csky_lms_f32( - const csky_lms_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - void csky_lms_init_f32( - csky_lms_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } csky_lms_instance_q15; - - void csky_lms_init_q15( - csky_lms_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint32_t postShift); - - void csky_lms_q15( - const csky_lms_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } csky_lms_instance_q31; - - void csky_lms_q31( - const csky_lms_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - void csky_lms_init_q31( - csky_lms_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint32_t postShift); - - - /** - * @brief Instance structure for the floating-point normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that control filter coefficient updates. */ - float32_t energy; /**< saves previous frame energy. */ - float32_t x0; /**< saves previous input sample. */ - } csky_lms_norm_instance_f32; - - void csky_lms_norm_f32( - csky_lms_norm_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - void csky_lms_norm_init_f32( - csky_lms_norm_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - q31_t *recipTable; /**< points to the reciprocal initial value table. */ - q31_t energy; /**< saves previous frame energy. */ - q31_t x0; /**< saves previous input sample. */ - } csky_lms_norm_instance_q31; - - void csky_lms_norm_q31( - csky_lms_norm_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - void csky_lms_norm_init_q31( - csky_lms_norm_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint8_t postShift); - - - /** - * @brief Instance structure for the Q15 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< Number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - q15_t *recipTable; /**< Points to the reciprocal initial value table. */ - q15_t energy; /**< saves previous frame energy. */ - q15_t x0; /**< saves previous input sample. */ - } csky_lms_norm_instance_q15; - - void csky_lms_norm_q15( - csky_lms_norm_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - void csky_lms_norm_init_q15( - csky_lms_norm_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint8_t postShift); - - void csky_correlate_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - void csky_correlate_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - void csky_correlate_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - void csky_correlate_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - void csky_correlate_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - void csky_correlate_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - void csky_correlate_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - void csky_correlate_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - void csky_correlate_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - - /** - * @brief Instance structure for the floating-point sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } csky_fir_sparse_instance_f32; - - /** - * @brief Instance structure for the Q31 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } csky_fir_sparse_instance_q31; - - /** - * @brief Instance structure for the Q15 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } csky_fir_sparse_instance_q15; - - /** - * @brief Instance structure for the Q7 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } csky_fir_sparse_instance_q7; - - void csky_fir_sparse_f32( - csky_fir_sparse_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - float32_t * pScratchIn, - uint32_t blockSize); - - void csky_fir_sparse_init_f32( - csky_fir_sparse_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - void csky_fir_sparse_q31( - csky_fir_sparse_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - q31_t * pScratchIn, - uint32_t blockSize); - - void csky_fir_sparse_init_q31( - csky_fir_sparse_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - void csky_fir_sparse_q15( - csky_fir_sparse_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - q15_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - void csky_fir_sparse_init_q15( - csky_fir_sparse_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - void csky_fir_sparse_q7( - csky_fir_sparse_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - q7_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - void csky_fir_sparse_init_q7( - csky_fir_sparse_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - void csky_sin_cos_f32( - float32_t theta, - float32_t * pSinVal, - float32_t * pCosVal); - - void csky_sin_cos_q31( - q31_t theta, - q31_t * pSinVal, - q31_t * pCosVal); - - void csky_cmplx_conj_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - void csky_cmplx_conj_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - void csky_cmplx_conj_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - void csky_cmplx_mag_squared_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - void csky_cmplx_mag_squared_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - void csky_cmplx_mag_squared_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - void csky_vsqrt_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - void csky_vsqrt_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - void csky_vsqrt_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t numSamples); - -/** - * @ingroup groupController - */ - -/** - * @defgroup PID PID Motor Control - * - * A Proportional Integral Derivative (PID) controller is a generic feedback control - * loop mechanism widely used in industrial control systems. - * A PID controller is the most commonly used type of feedback controller. - * - * This set of functions implements (PID) controllers - * for Q15, Q31, and floating-point data types. The functions operate on a single sample - * of data and each call to the function returns a single processed value. - * <code>S</code> points to an instance of the PID control data structure. <code>in</code> - * is the input sample value. The functions return the output value. - * - * \par Algorithm: - * <pre> - * y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] - * A0 = Kp + Ki + Kd - * A1 = (-Kp ) - (2 * Kd ) - * A2 = Kd </pre> - * - * \par - * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant - * - * \par - * \image html PID.gif "Proportional Integral Derivative Controller" - * - * \par - * The PID controller calculates an "error" value as the difference between - * the measured output and the reference input. - * The controller attempts to minimize the error by adjusting the process control inputs. - * The proportional value determines the reaction to the current error, - * the integral value determines the reaction based on the sum of recent errors, - * and the derivative value determines the reaction based on the rate at which the error has been changing. - * - * \par Instance Structure - * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. - * A separate instance structure must be defined for each PID Controller. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Reset Functions - * There is also an associated reset function for each data type which clears the state array. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. - * - Zeros out the values in the state buffer. - * - * \par - * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. - * - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the PID Controller functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup PID - * @{ - */ - -/** - * @brief Process function for the floating-point PID Control. - * @param[in,out] S is an instance of the floating-point PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - */ - __ALWAYS_STATIC_INLINE float32_t csky_pid_f32( - csky_pid_instance_f32 * S, - float32_t in) - { - float32_t out; - - /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ - out = (S->A0 * in) + - (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - } - -/** - * @} -*/ // end of PID group - - -/** - * @addtogroup PID - * @{ - */ - -/** - * @brief Process function for the Q31 PID Control. - * @param[in,out] S points to an instance of the Q31 PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around rather than clip. - * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. - * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. - */ - __ALWAYS_STATIC_INLINE q31_t csky_pid_q31( - csky_pid_instance_q31 * S, - q31_t in) - { - q63_t acc; - q31_t out; - - #ifdef CSKY_SIMD - /* acc = A0 * x[n] */ - acc = mult_32x32_keep64(S->A0, in); - - /* acc += A1 * x[n-1] */ - acc = multAcc_32x32_keep64(acc, S->A1, S->state[0]); - - /* acc += A2 * x[n-2] */ - acc = multAcc_32x32_keep64(acc, S->A2, S->state[1]); - - /* convert output to 1.31 format to add y[n-1] */ - out = dext_31(acc); - #else - /* acc = A0 * x[n] */ - acc = (q63_t) S->A0 * in; - - /* acc += A1 * x[n-1] */ - acc += (q63_t) S->A1 * S->state[0]; - - /* acc += A2 * x[n-2] */ - acc += (q63_t) S->A2 * S->state[1]; - - /* convert output to 1.31 format to add y[n-1] */ - out = (q31_t) (acc >> 31u); - #endif - - /* out += y[n-1] */ - out += S->state[2]; - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - } - -/** - * @} - */ // end of PID group - -/** - * @addtogroup PID - * @{ - */ -/** - * @brief Process function for the Q15 PID Control. - * @param[in,out] S points to an instance of the Q15 PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - * Lastly, the accumulator is saturated to yield a result in 1.15 format. - */ - __ALWAYS_STATIC_INLINE q15_t csky_pid_q15( - csky_pid_instance_q15 * S, - q15_t in) - { - q63_t acc; - q15_t out; - - /* acc = A0 * x[n] */ - acc = ((q31_t) S->A0) * in; - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc += (q31_t) S->A1 * S->state[0]; - acc += (q31_t) S->A2 * S->state[1]; - - /* acc += y[n-1] */ - acc += (q31_t) S->state[2] << 15; - - /* saturate the output */ - out = (q15_t) (__SSAT_16((acc >> 15))); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - } -/** - * @} - */ // end of PID group - - csky_status csky_mat_inverse_f32( - const csky_matrix_instance_f32 * src, - csky_matrix_instance_f32 * dst); - - csky_status csky_mat_inverse_f64( - const csky_matrix_instance_f64 * src, - csky_matrix_instance_f64 * dst); - -/** - * @ingroup groupController - */ - -/** - * @defgroup clarke Vector Clarke Transform - * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. - * Generally the Clarke transform uses three-phase currents <code>Ia, Ib and Ic</code> to calculate currents - * in the two-phase orthogonal stator axis <code>Ialpha</code> and <code>Ibeta</code>. - * When <code>Ialpha</code> is superposed with <code>Ia</code> as shown in the figure below - * \image html clarke.gif Stator current space vector and its components in (a,b). - * and <code>Ia + Ib + Ic = 0</code>, in this condition <code>Ialpha</code> and <code>Ibeta</code> - * can be calculated using only <code>Ia</code> and <code>Ib</code>. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeFormula.gif - * where <code>Ia</code> and <code>Ib</code> are the instantaneous stator phases and - * <code>pIalpha</code> and <code>pIbeta</code> are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup clarke - * @{ - */ - -/** - * - * @brief Floating-point Clarke transform - * @param[in] Ia input three-phase coordinate a - * @param[in] Ib input three-phase coordinate b - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - */ - __ALWAYS_STATIC_INLINE void csky_clarke_f32( - float32_t Ia, - float32_t Ib, - float32_t * pIalpha, - float32_t * pIbeta) - { - /* Calculate pIalpha using the equation, pIalpha = Ia */ - *pIalpha = Ia; - - /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ - *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); - } - -/** - * @} - */ // end of clarke group - - -/** - * @addtogroup clarke - * @{ - */ - -/** - * @brief Clarke transform for Q31 version - * @param[in] Ia input three-phase coordinate a - * @param[in] Ib input three-phase coordinate b - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition, hence there is no risk of overflow. - */ - __ALWAYS_STATIC_INLINE void csky_clarke_q31( - q31_t Ia, - q31_t Ib, - q31_t * pIalpha, - q31_t * pIbeta) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIalpha from Ia by equation pIalpha = Ia */ - *pIalpha = Ia; - - #ifdef CSKY_SIMD - /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ - product1 = mult_32x32_dext_30(Ia, 0x24F34E8B); - - /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ - product2 = mult_32x32_dext_30(Ib, 0x49E69D16); - #else - /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); - - /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ - product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); - #endif - - /* pIbeta is calculated by adding the intermediate products */ - *pIbeta = __QADD(product1, product2); - } - - -/** - * @} - */ // end of clarke group - - void csky_q7_to_q31( - q7_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - -/** - * @ingroup groupController - */ -/** - * @defgroup inv_clarke Vector Inverse Clarke Transform - * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeInvFormula.gif - * where <code>pIa</code> and <code>pIb</code> are the instantaneous stator phases and - * <code>Ialpha</code> and <code>Ibeta</code> are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - -/** - * @addtogroup inv_clarke - * @{ - */ - - /** - * @brief Floating-point Inverse Clarke transform - * @param[in] Ialpha input two-phase orthogonal vector axis alpha - * @param[in] Ibeta input two-phase orthogonal vector axis beta - * @param[out] pIa points to output three-phase coordinate <code>a</code> - * @param[out] pIb points to output three-phase coordinate <code>b</code> - */ - __ALWAYS_STATIC_INLINE void csky_inv_clarke_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pIa, - float32_t * pIb) - { - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ - *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta; - } - - -/** - * @} - */ // end of inv_clarke group - -/** - * @addtogroup inv_clarke - * @{ - */ - -/** - * @brief Inverse Clarke transform for Q31 version - * @param[in] Ialpha input two-phase orthogonal vector axis alpha - * @param[in] Ibeta input two-phase orthogonal vector axis beta - * @param[out] pIa points to output three-phase coordinate <code>a</code> - * @param[out] pIb points to output three-phase coordinate <code>b</code> - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the subtraction, hence there is no risk of overflow. - */ - __ALWAYS_STATIC_INLINE void csky_inv_clarke_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pIa, - q31_t * pIb) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - #ifdef CSKY_SIMD - /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ - product1 = mult_32x32_dext_31(Ialpha, 0x40000000); - - /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ - product2 = mult_32x32_dext_31(Ibeta, 0x6ED9EBA1); - #else - /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); - - /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); - #endif - - /* pIb is calculated by subtracting the products */ - *pIb = __QSUB(product2, product1); - } - -/** - * @} - */ // end of inv_clarke group - - void csky_q7_to_q15( - q7_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - -/** - * @ingroup groupController - */ -/** - * @defgroup park Vector Park Transform - * - * Forward Park transform converts the input two-coordinate vector to flux and torque components. - * The Park transform can be used to realize the transformation of the <code>Ialpha</code> and the <code>Ibeta</code> currents - * from the stationary to the moving reference frame and control the spatial relationship between - * the stator vector current and rotor flux vector. - * If we consider the d axis aligned with the rotor flux, the diagram below shows the - * current vector and the relationship from the two reference frames: - * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkFormula.gif - * where <code>Ialpha</code> and <code>Ibeta</code> are the stator vector components, - * <code>pId</code> and <code>pIq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ -/** - * @addtogroup park - * @{ - */ -/** - * @brief Floating-point Park transform - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] pId points to output rotor reference frame d - * @param[out] pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * - * The function implements the forward Park transform. - * - */ - __ALWAYS_STATIC_INLINE void csky_park_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pId, - float32_t * pIq, - float32_t sinVal, - float32_t cosVal) -{ - /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ - *pId = Ialpha * cosVal + Ibeta * sinVal; - /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ - *pIq = -Ialpha * sinVal + Ibeta * cosVal; -} -/** - * @} - */ // end of park group - -/** - * @addtogroup park - * @{ - */ -/** - * @brief Park transform for Q31 version - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] pId points to output rotor reference frame d - * @param[out] pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition and subtraction, hence there is no risk of overflow. - */ - __ALWAYS_STATIC_INLINE void csky_park_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pId, - q31_t * pIq, - q31_t sinVal, - q31_t cosVal) -{ -#ifdef CSKY_SIMD - __ASM volatile( - "rmul.s32.h t0, %0, %3\n\t" - "rmul.s32.h t1, %1, %2\n\t" - "add.s32.s t0, t0, t1\n\t" - "st.w t0, (%4, 0x0)\n\t" - "rmul.s32.h t0, %0, %2\n\t" - "rmul.s32.h t1, %1, %3\n\t" - "sub.s32.s t1, t1, t0\n\t" - "st.w t1, (%5, 0x0)\n\t" - ::"r"(Ialpha),"r"(Ibeta),"r"(sinVal),"r"(cosVal),"r"(pId),"r"(pIq) - :"t0","t1", "memory"); -#else - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - /* Intermediate product is calculated by (Ialpha * cosVal) */ - product1 = clip_q63_to_q31 (((q63_t) (Ialpha) * (cosVal)) >> 31); - /* Intermediate product is calculated by (Ibeta * sinVal) */ - product2 = clip_q63_to_q31 (((q63_t) (Ibeta) * (sinVal)) >> 31); - /* Intermediate product is calculated by (Ialpha * sinVal) */ - product3 = clip_q63_to_q31 (((q63_t) (Ialpha) * (sinVal)) >> 31); - /* Intermediate product is calculated by (Ibeta * cosVal) */ - product4 = clip_q63_to_q31 (((q63_t) (Ibeta) * (cosVal)) >> 31); - /* Calculate pId by adding the two intermediate products 1 and 2 */ - *pId = __QADD(product1, product2); - /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ - *pIq = __QSUB(product4, product3); -#endif -} -/** - * @} - */ // end of park group - - void csky_q7_to_float( - q7_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - -/** - * @ingroup groupController - */ -/** - * @defgroup inv_park Vector Inverse Park transform - * Inverse Park transform converts the input flux and torque components to two-coordinate vector. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkInvFormula.gif - * where <code>pIalpha</code> and <code>pIbeta</code> are the stator vector components, - * <code>Id</code> and <code>Iq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ -/** - * @addtogroup inv_park - * @{ - */ - /** - * @brief Floating-point Inverse Park transform - * @param[in] Id input coordinate of rotor reference frame d - * @param[in] Iq input coordinate of rotor reference frame q - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - */ - __ALWAYS_STATIC_INLINE void csky_inv_park_f32( - float32_t Id, - float32_t Iq, - float32_t * pIalpha, - float32_t * pIbeta, - float32_t sinVal, - float32_t cosVal) -{ - /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ - *pIalpha = Id * cosVal - Iq * sinVal; - /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ - *pIbeta = Id * sinVal + Iq * cosVal; -} -/** - * @} - */ // end of inv_park group - -/** - * @addtogroup inv_park - * @{ - */ -/** - * @brief Inverse Park transform for Q31 version - * @param[in] Id input coordinate of rotor reference frame d - * @param[in] Iq input coordinate of rotor reference frame q - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition, hence there is no risk of overflow. - */ - __ALWAYS_STATIC_INLINE void csky_inv_park_q31( - q31_t Id, - q31_t Iq, - q31_t * pIalpha, - q31_t * pIbeta, - q31_t sinVal, - q31_t cosVal) -{ -#ifdef CSKY_SIMD - __ASM volatile( - "rmul.s32.h t0, %0, %3\n\t" - "rmul.s32.h t1, %1, %2\n\t" - "sub.s32.s t0, t0, t1\n\t" - "st.w t0, (%4, 0x0)\n\t" - "rmul.s32.h t0, %0, %2\n\t" - "rmul.s32.h t1, %1, %3\n\t" - "add.s32.s t0, t0, t1\n\t" - "st.w t0, (%5, 0x0)\n\t" - ::"r"(Id),"r"(Iq),"r"(sinVal),"r"(cosVal),"r"(pIalpha),"r"(pIbeta) - :"t0","t1", "memory"); - -#else - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - /* Intermediate product is calculated by (Id * cosVal) */ - product1 = clip_q63_to_q31 (((q63_t) (Id) * (cosVal)) >> 31); - /* Intermediate product is calculated by (Iq * sinVal) */ - product2 = clip_q63_to_q31 (((q63_t) (Iq) * (sinVal)) >> 31); - /* Intermediate product is calculated by (Id * sinVal) */ - product3 = clip_q63_to_q31 (((q63_t) (Id) * (sinVal)) >> 31); - /* Intermediate product is calculated by (Iq * cosVal) */ - product4 = clip_q63_to_q31 (((q63_t) (Iq) * (cosVal)) >> 31); - /* Calculate pIalpha by using the two intermediate products 1 and 2 */ - *pIalpha = __QSUB(product1, product2); - /* Calculate pIbeta by using the two intermediate products 3 and 4 */ - *pIbeta = __QADD(product4, product3); -#endif -} - -/** - * @} - */ // end of inv_park group - - void csky_q31_to_float( - q31_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - -/** - * @ingroup groupInterpolation - */ -/** - * @defgroup LinearInterpolate Linear Interpolation - * - * Linear interpolation is a method of curve fitting using linear polynomials. - * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line - * - * \par - * \image html LinearInterp.gif "Linear interpolation" - * - * \par - * A Linear Interpolate function calculates an output value(y), for the input(x) - * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) - * - * \par Algorithm: - * <pre> - * y = y0 + (x - x0) * ((y1 - y0)/(x1-x0)) - * where x0, x1 are nearest values of input x - * y0, y1 are nearest values to output y - * </pre> - * - * \par - * This set of functions implements Linear interpolation process - * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single - * sample of data and each call to the function returns a single processed value. - * <code>S</code> points to an instance of the Linear Interpolate function data structure. - * <code>x</code> is the input sample value. The functions returns the output value. - * - * \par - * if x is outside of the table boundary, Linear interpolation returns first value of the table - * if x is below input range and returns last value of table if x is above range. - */ -/** - * @addtogroup LinearInterpolate - * @{ - */ -/** - * @brief Process function for the floating-point Linear Interpolation Function. - * @param[in,out] S is an instance of the floating-point Linear Interpolation structure - * @param[in] x input sample to process - * @return y processed output sample. - * - */ -__ALWAYS_STATIC_INLINE float32_t csky_linear_interp_f32( -csky_linear_interp_instance_f32 * S, -float32_t x) -{ - float32_t y; - float32_t x0, x1; /* Nearest input values */ - float32_t y0, y1; /* Nearest output values */ - float32_t xSpacing = S->xSpacing; /* spacing between input values */ - int32_t i; /* Index variable */ - float32_t *pYData = S->pYData; /* pointer to output table */ - /* Calculation of index */ - i = (int32_t) ((x - S->x1) / xSpacing); - if(i < 0) - { - /* Iniatilize output for below specified range as least output value of table */ - y = pYData[0]; - } - else if((uint32_t)i >= S->nValues) - { - /* Iniatilize output for above specified range as last output value of table */ - y = pYData[S->nValues - 1]; - } - else - { - /* Calculation of nearest input values */ - x0 = S->x1 + i * xSpacing; - x1 = S->x1 + (i + 1) * xSpacing; - /* Read of nearest output values */ - y0 = pYData[i]; - y1 = pYData[i + 1]; - /* Calculation of output */ - y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); - } - /* returns output value */ - return (y); -} -/** - * @} - */ // end of LinearInterpolate group - -/** - * @addtogroup LinearInterpolate - * @{ - */ - -/** - * @brief Process function for the Q31 Linear Interpolation Function. - * @param[in] pYData pointer to Q31 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ -__ALWAYS_STATIC_INLINE q31_t csky_linear_interp_q31( -q31_t * pYData, -q31_t x, -uint32_t nValues) -{ - q31_t y; /* output */ - q31_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & (q31_t)0xFFF00000) >> 20); - if(index >= (int32_t)(nValues - 1)) - { - return (pYData[nValues - 1]); - } - else if(index < 0) - { - return (pYData[0]); - } - else - { - /* 20 bits for the fractional part */ - /* shift left by 11 to keep fract in 1.31 format */ - fract = (x & 0x000FFFFF) << 11; - /* Read two nearest output values from the index in 1.31(q31) format */ - y0 = pYData[index]; - y1 = pYData[index + 1]; -#ifdef CSKY_SIMD - /* Calculation of y0 * (1-fract) and y is in 2.30 format */ - y = mult_32x32_keep32(y0, (0x7FFFFFFF - fract)); - /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ - y = multAcc_32x32_keep32(y, y1, fract); -#else - /* Calculation of y0 * (1-fract) and y is in 2.30 format */ - y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); - /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ - y += ((q31_t) (((q63_t) y1 * fract) >> 32)); -#endif - /* Convert y to 1.31 format */ - return (y << 1u); - } -} -/** - * @} - */ // end of LinearInterpolate group - -/** - * @addtogroup LinearInterpolate - * @{ - */ -/** - * - * @brief Process function for the Q15 Linear Interpolation Function. - * @param[in] pYData pointer to Q15 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ -__ALWAYS_STATIC_INLINE q15_t csky_linear_interp_q15( -q15_t * pYData, -q31_t x, -uint32_t nValues) -{ - q63_t y; /* output */ - q15_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & (int32_t)0xFFF00000) >> 20); - if(index >= (int32_t)(nValues - 1)) - { - return (pYData[nValues - 1]); - } - else if(index < 0) - { - return (pYData[0]); - } - else - { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - /* Read two nearest output values from the index */ - y0 = pYData[index]; - y1 = pYData[index + 1]; -#ifdef CSKY_SIMD - /* Calculation of y0 * (1-fract) and y is in 13.35 format */ - y = mult_32x32_keep64(y0, (0xFFFFF - fract)); - /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ - y = multAcc_32x32_keep64(y, y1, (fract)); -#else - /* Calculation of y0 * (1-fract) and y is in 13.35 format */ - y = ((q63_t) y0 * (0xFFFFF - fract)); - /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ - y += ((q63_t) y1 * (fract)); -#endif - /* convert y to 1.15 format */ - return (q15_t) (y >> 20); - } -} -/** - * @} - */ // end of LinearInterpolate group - -/** - * @addtogroup LinearInterpolate - * @{ - */ -/** - * - * @brief Process function for the Q7 Linear Interpolation Function. - * @param[in] pYData pointer to Q7 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - */ -__ALWAYS_STATIC_INLINE q7_t csky_linear_interp_q7( -q7_t * pYData, -q31_t x, -uint32_t nValues) -{ - q31_t y; /* output */ - q7_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - uint32_t index; /* Index to read nearest output values */ - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - if (x < 0) - { - return (pYData[0]); - } - index = (x >> 20) & 0xfff; - if(index >= (nValues - 1)) - { - return (pYData[nValues - 1]); - } - else - { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - /* Read two nearest output values from the index and are in 1.7(q7) format */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ - y = ((y0 * (0xFFFFF - fract))); - /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ - y += (y1 * fract); - /* convert y to 1.7(q7) format */ - return (q7_t) (y >> 20); - } -} -/** - * @} - */ // end of LinearInterpolate group - - float32_t csky_sin_f32( - float32_t x); - - q31_t csky_sin_q31( - q31_t x); - - q15_t csky_sin_q15( - q15_t x); - - float32_t csky_cos_f32( - float32_t x); - - q31_t csky_cos_q31( - q31_t x); - - q15_t csky_cos_q15( - q15_t x); - - csky_status csky_sqrt_f32( - float32_t in, - float32_t * pOut); - - csky_status csky_sqrt_q31( - q31_t in, - q31_t * pOut); - - csky_status csky_sqrt_q15( - q15_t in, - q15_t * pOut); - - void csky_power_q31( - q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - void csky_power_int32( - int32_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - void csky_power_int32( - int32_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - void csky_power_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - void csky_power_q15( - q15_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - void csky_power_q7( - q7_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - void csky_mean_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult); - - void csky_mean_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - void csky_mean_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - void csky_mean_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - void csky_var_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - void csky_var_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - void csky_var_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - void csky_rms_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - void csky_rms_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - void csky_rms_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - void csky_std_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - void csky_std_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - void csky_std_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - void csky_cmplx_mag_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - void csky_cmplx_mag_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - void csky_cmplx_mag_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - void csky_cmplx_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t numSamples, - q31_t * realResult, - q31_t * imagResult); - - void csky_cmplx_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t numSamples, - q63_t * realResult, - q63_t * imagResult); - - void csky_cmplx_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t numSamples, - float32_t * realResult, - float32_t * imagResult); - - void csky_cmplx_mult_real_q15( - q15_t * pSrcCmplx, - q15_t * pSrcReal, - q15_t * pCmplxDst, - uint32_t numSamples); - - void csky_cmplx_mult_real_q31( - q31_t * pSrcCmplx, - q31_t * pSrcReal, - q31_t * pCmplxDst, - uint32_t numSamples); - - void csky_cmplx_mult_real_f32( - float32_t * pSrcCmplx, - float32_t * pSrcReal, - float32_t * pCmplxDst, - uint32_t numSamples); - - void csky_min_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * result, - uint32_t * index); - - void csky_min_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - void csky_min_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - void csky_min_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - void csky_max_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex); - - void csky_max_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - void csky_max_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - void csky_max_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - void csky_cmplx_mult_cmplx_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t numSamples); - - void csky_cmplx_mult_cmplx_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t numSamples); - - void csky_cmplx_mult_cmplx_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - - void csky_cmplx_mult_cmplx_re_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t numSamples); - - void csky_cmplx_mult_cmplx_re_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t numSamples); - - void csky_cmplx_mult_cmplx_re_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - - - void csky_float_to_q31( - float32_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_float_to_q15( - float32_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_float_to_q7( - float32_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - void csky_q31_to_q15( - q31_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_q31_to_q7( - q31_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - void csky_q15_to_float( - q15_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_q15_to_q31( - q15_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_q15_to_q7( - q15_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - -/** - * @ingroup groupInterpolation - */ -/** - * @defgroup BilinearInterpolate Bilinear Interpolation - * - * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. - * The underlying function <code>f(x, y)</code> is sampled on a regular grid and the interpolation process - * determines values between the grid points. - * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. - * Bilinear interpolation is often used in image processing to rescale images. - * The CSI DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. - * - * <b>Algorithm</b> - * \par - * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. - * For floating-point, the instance structure is defined as: - * <pre> - * typedef struct - * { - * uint16_t numRows; - * uint16_t numCols; - * float32_t *pData; - * } csky_bilinear_interp_instance_f32; - * </pre> - * - * \par - * where <code>numRows</code> specifies the number of rows in the table; - * <code>numCols</code> specifies the number of columns in the table; - * and <code>pData</code> points to an array of size <code>numRows*numCols</code> values. - * The data table <code>pTable</code> is organized in row order and the supplied data values fall on integer indexes. - * That is, table element (x,y) is located at <code>pTable[x + y*numCols]</code> where x and y are integers. - * - * \par - * Let <code>(x, y)</code> specify the desired interpolation point. Then define: - * <pre> - * XF = floor(x) - * YF = floor(y) - * </pre> - * \par - * The interpolated output point is computed as: - * <pre> - * f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF)) - * + f(XF+1, YF) * (x-XF)*(1-(y-YF)) - * + f(XF, YF+1) * (1-(x-XF))*(y-YF) - * + f(XF+1, YF+1) * (x-XF)*(y-YF) - * </pre> - * Note that the coordinates (x, y) contain integer and fractional components. - * The integer components specify which portion of the table to use while the - * fractional components control the interpolation processor. - * - * \par - * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. - */ -/** - * @addtogroup BilinearInterpolate - * @{ - */ -/** -* -* @brief Floating-point bilinear interpolation. -* @param[in,out] S points to an instance of the interpolation structure. -* @param[in] X interpolation coordinate. -* @param[in] Y interpolation coordinate. -* @return out interpolated value. -*/ -__ALWAYS_STATIC_INLINE float32_t csky_bilinear_interp_f32( -const csky_bilinear_interp_instance_f32 * S, -float32_t X, -float32_t Y) -{ - float32_t out; - float32_t f00, f01, f10, f11; - float32_t *pData = S->pData; - int32_t xIndex, yIndex, index; - float32_t xdiff, ydiff; - float32_t b1, b2, b3, b4; - xIndex = (int32_t) X; - yIndex = (int32_t) Y; - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0 || yIndex > (S->numCols - 1)) - { - return (0); - } - /* Calculation of index for two nearest points in X-direction */ - index = (xIndex - 1) + (yIndex - 1) * S->numCols; - /* Read two nearest points in X-direction */ - f00 = pData[index]; - f01 = pData[index + 1]; - /* Calculation of index for two nearest points in Y-direction */ - index = (xIndex - 1) + (yIndex) * S->numCols; - /* Read two nearest points in Y-direction */ - f10 = pData[index]; - f11 = pData[index + 1]; - /* Calculation of intermediate values */ - b1 = f00; - b2 = f01 - f00; - b3 = f10 - f00; - b4 = f00 - f01 - f10 + f11; - /* Calculation of fractional part in X */ - xdiff = X - xIndex; - /* Calculation of fractional part in Y */ - ydiff = Y - yIndex; - /* Calculation of bi-linear interpolated output */ - out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; - /* return to application */ - return (out); -} -/** - * @} - */ // end of BilinearInterpolate group - -/** - * @addtogroup BilinearInterpolate - * @{ - */ -/** -* -* @brief Q31 bilinear interpolation. -* @param[in,out] S points to an instance of the interpolation structure. -* @param[in] X interpolation coordinate in 12.20 format. -* @param[in] Y interpolation coordinate in 12.20 format. -* @return out interpolated value. -*/ -__ALWAYS_STATIC_INLINE q31_t csky_bilinear_interp_q31( -csky_bilinear_interp_instance_q31 * S, -q31_t X, -q31_t Y) -{ - q31_t out; /* Temporary output */ - q31_t acc = 0; /* output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q31_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q31_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) - { - return (0); - } - /* 20 bits for the fractional part */ - /* shift left xfract by 11 to keep 1.31 format */ - xfract = (X & 0x000FFFFF) << 11u; - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + (int32_t)nCols * (cI) ]; - x2 = pYData[(rI) + (int32_t)nCols * (cI) + 1]; - /* 20 bits for the fractional part */ - /* shift left yfract by 11 to keep 1.31 format */ - yfract = (Y & 0x000FFFFF) << 11u; - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + (int32_t)nCols * (cI + 1) ]; - y2 = pYData[(rI) + (int32_t)nCols * (cI + 1) + 1]; -#ifdef CSKY_SIMD - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ - out = mult_32x32_keep32(x1, (0x7FFFFFFF - xfract)); - acc = mult_32x32_keep32(out, (0x7FFFFFFF - yfract)); - /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ - out = mult_32x32_keep32(x2, (0x7FFFFFFF - yfract)); - acc = multAcc_32x32_keep32(acc, out, xfract); - /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = mult_32x32_keep32(y1, (0x7FFFFFFF - xfract)); - acc = multAcc_32x32_keep32(acc, out, yfract); - /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = mult_32x32_keep32(y2, xfract); - acc = multAcc_32x32_keep32(acc, out, yfract); -#else - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ - out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); - acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); - /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); - /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); -#endif - /* Convert acc to 1.31(q31) format */ - return ((q31_t)(acc << 2)); -} -/** - * @} - */ // end of BilinearInterpolate group - -/** - * @addtogroup BilinearInterpolate - * @{ - */ -/** -* @brief Q15 bilinear interpolation. -* @param[in,out] S points to an instance of the interpolation structure. -* @param[in] X interpolation coordinate in 12.20 format. -* @param[in] Y interpolation coordinate in 12.20 format. -* @return out interpolated value. -*/ -__ALWAYS_STATIC_INLINE q15_t csky_bilinear_interp_q15( -csky_bilinear_interp_instance_q15 * S, -q31_t X, -q31_t Y) -{ - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q15_t x1, x2, y1, y2; /* Nearest output values */ - q31_t xfract, yfract; /* X, Y fractional parts */ - int32_t rI, cI; /* Row and column indices */ - q15_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) - { - return (0); - } - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & 0x000FFFFF); - /* Read two nearest output values from the index */ - x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; - x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & 0x000FFFFF); - /* Read two nearest output values from the index */ - y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; - y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ - /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ - /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ -#ifdef CSKY_SIMD - out = mult_32x32_dext_4(x1, (0xFFFFF - xfract)); - acc = mult_32x32_keep64(out, (0xFFFFF - yfract)); - /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ - out = mult_32x32_dext_4(x2, (0xFFFFF - yfract)); - acc = multAcc_32x32_keep64(acc, out, (xfract)); - /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ - out = mult_32x32_dext_4(y1, (0xFFFFF - xfract)); - acc = multAcc_32x32_keep64(acc, out, (yfract)); - /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ - out = mult_32x32_dext_4(y2, (xfract)); - acc = multAcc_32x32_keep64(acc, out, (yfract)); -#else - out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4u); - acc = ((q63_t) out * (0xFFFFF - yfract)); - /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4u); - acc += ((q63_t) out * (xfract)); - /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4u); - acc += ((q63_t) out * (yfract)); - /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y2 * (xfract)) >> 4u); - acc += ((q63_t) out * (yfract)); -#endif - /* acc is in 13.51 format and down shift acc by 36 times */ - /* Convert out to 1.15 format */ - return ((q15_t)(acc >> 36)); -} -/** - * @} - */ // end of BilinearInterpolate group - -/** - * @addtogroup BilinearInterpolate - * @{ - */ -/** -* @brief Q7 bilinear interpolation. -* @param[in,out] S points to an instance of the interpolation structure. -* @param[in] X interpolation coordinate in 12.20 format. -* @param[in] Y interpolation coordinate in 12.20 format. -* @return out interpolated value. -*/ -__ALWAYS_STATIC_INLINE q7_t csky_bilinear_interp_q7( -csky_bilinear_interp_instance_q7 * S, -q31_t X, -q31_t Y) -{ - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q7_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q7_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) - { - return (0); - } - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & (q31_t)0x000FFFFF); - /* Read two nearest output values from the index */ - x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; - x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & (q31_t)0x000FFFFF); - /* Read two nearest output values from the index */ - y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; - y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ - out = ((x1 * (0xFFFFF - xfract))); -#ifdef CSKY_SIMD - acc = multAcc_32x32_keep64(acc, out, (0xFFFFF - yfract)); - /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ - out = ((x2 * (0xFFFFF - yfract))); - acc = multAcc_32x32_keep64(acc, out, xfract); - /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y1 * (0xFFFFF - xfract))); - acc = multAcc_32x32_keep64(acc, out, yfract); - /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y2 * (yfract))); - acc = multAcc_32x32_keep64(acc, out, xfract); -#else - acc = (((q63_t) out * (0xFFFFF - yfract))); - /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ - out = ((x2 * (0xFFFFF - yfract))); - acc += (((q63_t) out * (xfract))); - /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y1 * (0xFFFFF - xfract))); - acc += (((q63_t) out * (yfract))); - /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y2 * (yfract))); - acc += (((q63_t) out * (xfract))); -#endif - /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ - return ((q7_t)(acc >> 40)); -} -/** - * @} - */ // end of BilinearInterpolate group - -/** - * @ingroup groupMath - */ - -/** - * @defgroup ShiftRight Right Shift - * - * Shift the input value to right with appointed bits, its basic format is: - * <pre> - * a = (a) >> (shift), 1 =< shift <= bitof(a) - 1. - * </pre> - * The basic format is only designed for q31. - * - * and the extended format should be rounding to +inf: - * <pre> - * a = (a + (1<<(shift - 1)) >> (shift), 1 =< shift <= bitof(a) - 1. - * </pre> - * - * which are designed for q31, q31 positive and q63. - */ - -/** - * @addtogroup ShiftRight - * @{ - */ -/** - * @brief right shift Q31 version - * @param[in] a input value to be shift. - * @param[in] shift input positive value, the number of bits to be shift. - * @param[out] result the shifted a. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is only used for right shift. So, the value of shift is - * between[1,31]. - */ - __ALWAYS_STATIC_INLINE q31_t csky_shr_q31( - q31_t a, - q31_t shift) -{ - q31_t res; -#ifdef CSKY_SIMD - __ASM volatile( - "asr %0, %1, %2\n\t" - :"=r"(res), "=r"(a),"=r"(shift):"0"(res), "1"(a), "2"(shift)); -#else - res = ((a) >> (shift)); -#endif - return res; -} - -#define SHR(a, shift) csky_shr_q31(a, shift) - -/** - * @} - */ // end of ShiftRight group - - -/** - * @addtogroup ShiftRight - * @{ - */ -/** - * @brief right shift Q31 version - * @param[in] a input value to be shift. - * @param[in] shift input positive value, the number of bits to be shift. - * @param[out] result the shifted a. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is only used for right shift. So, the value of shift is - * between[1,31]. And the output value is rounding to +inf. - */ - __ALWAYS_STATIC_INLINE q31_t csky_pshr_q31( - q31_t a, - q31_t shift) -{ - q31_t res; -#ifdef CSKY_SIMD - __ASM volatile( - "asr.s32.r %0, %1, %2\n\t" - :"=r"(res), "=r"(a),"=r"(shift):"0"(res), "1"(a), "2"(shift)); -#else - res = (a >= 0?(SHR((a) + (1<<(shift - 1)), shift))\ - :(SHR((a) + ((1<<shift)>>1) -1, shift))); -#endif - return res; -} - -/** - * @} - */ // end of ShiftRight group - - -/** - * @addtogroup ShiftRight - * @{ - */ -/** - * @brief right shift Q31 version - * @param[in] a input positive value to be shift. - * @param[in] shift input positive value, the number of bits to be shift. - * @param[out] result the shifted a. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is only used for right shift. So, the value of shift is - * between[1,31]. And the output value is rounding to +inf. - */ - __ALWAYS_STATIC_INLINE q31_t csky_pshr_pos_q31( - q31_t a, - q31_t shift) -{ - q31_t res; -#ifdef CSKY_SIMD - __ASM volatile( - "asr.s32.r %0, %1, %2\n\t" - :"=r"(res), "=r"(a),"=r"(shift):"0"(res), "1"(a), "2"(shift)); -#else - res = SHR((a) + (1<<(shift - 1)), shift); -#endif - return res; -} - -/** - * @} - */ // end of ShiftRight group - - -/** - * @addtogroup ShiftRight - * @{ - */ -/** - * @brief right shift Q63 version - * @param[in] a input value to be shift. - * @param[in] shift input positive value, the number of bits to be shift. - * @param[out] result the shifted a. - * - * <b>Scaling and Overflow Behavior:</b> - * \par - * The function is only used for right shift. So, the value of shift is - * between[1,63]. And the output value is rounding to +inf. - */ - __ALWAYS_STATIC_INLINE q63_t csky_pshr_q63( - q63_t a, - q31_t shift) -{ - q63_t res; -#ifdef CSKY_SIMD - __ASM volatile( - "subi t0, %2, 1\n\t" - "cmphsi t0, 32\n\t" - "bt 1f\n\t" - "movi t1, 1\n\t" - "lsl t0, t1, t0\n\t" - "movi t1, 0\n\t" - "add.s64.s %1, %1, t0\n\t" - "dext %0, %1, %R1, %2\n\t" - "asr %R0, %R1, %2\n\t" - "br 2f\n\t" - "1:\n\t" - "subi %2, %2, 32\n\t" - "subi t0, t0, 32\n\t" - "movi t1, 1\n\t" - "lsl t1, t1, t0\n\t" - "add.s32.s %R1, %R1, t1\n\t" - "asr %0, %R1, %2\n\t" - "asri %R0, %R1, 31\n\t" - "2:\n\t" - :"=r"(res), "=r"(a),"=r"(shift):"0"(res), "1"(a), "2"(shift):"t0", "t1"); -#else - res = (a >= 0?(SHR((a) + ((q63_t)1<<(shift - 1)), shift))\ - :(SHR((a) + (((q63_t)1<<shift)>>1) -1, shift))); -#endif - return res; -} - -/** - * @} - */ // end of ShiftRight group - -//#define SHR(a, shift) csky_shr_q31(a, shift) -#define PSHR(a, shift) csky_pshr_q31(a, shift) -#define PSHR_POSITIVE(a, shift) csky_pshr_pos_q31(a, shift) -#define PSHR64(a, shift) csky_pshr_q63(a, shift) - - -#ifdef CSKY_SIMD -#else -/* SMMLAR */ -#define multAcc_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) - -/* SMMLSR */ -#define multSub_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) - -/* SMMULR */ -#define mult_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) - -/* SMMLA */ -#define multAcc_32x32_keep32(a, x, y) \ - a += (q31_t) (((q63_t) x * y) >> 32) - -/* SMMLS */ -#define multSub_32x32_keep32(a, x, y) \ - a -= (q31_t) (((q63_t) x * y) >> 32) - -/* SMMUL */ -#define mult_32x32_keep32(a, x, y) \ - a = (q31_t) (((q63_t) x * y ) >> 32) -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* _CSKY_MATH_H */ - -/** - * - * End of file. - */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_vdsp2_const_structs.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_vdsp2_const_structs.h deleted file mode 100644 index 618f5f92..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_vdsp2_const_structs.h +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (C) 2016-2019 C-SKY Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file csky_vdsp2_const_structs.h - * @brief This file has constant structs that are initialized for - * user convenience. For example, some can be given as - * arguments to the csky_vdsp2_cfft_f32() function. - * @version V1.0 - * @date 20. Dec 2016 - ******************************************************************************/ - -#ifndef _CSKY_CONST_STRUCTS_H -#define _CSKY_CONST_STRUCTS_H - -#include "csky_vdsp2_math.h" -#include "csky_common_tables.h" - - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_sR_f32_len16; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_sR_f32_len32; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_sR_f32_len64; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_sR_f32_len128; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_sR_f32_len256; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_sR_f32_len512; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_sR_f32_len1024; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_sR_f32_len2048; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_sR_f32_len4096; - - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_sR_f32_len16; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_sR_f32_len32; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_sR_f32_len64; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_sR_f32_len128; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_sR_f32_len256; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_sR_f32_len512; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_sR_f32_len1024; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_sR_f32_len2048; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_sR_f32_len4096; - - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_fast_sR_f32_len16; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_fast_sR_f32_len32; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_fast_sR_f32_len64; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_fast_sR_f32_len128; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_fast_sR_f32_len256; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_fast_sR_f32_len512; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_fast_sR_f32_len1024; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_fast_sR_f32_len2048; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix4_fast_sR_f32_len4096; - - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix2_sR_f32_len16; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix2_sR_f32_len32; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix2_sR_f32_len64; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix2_sR_f32_len128; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix2_sR_f32_len256; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix2_sR_f32_len512; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix2_sR_f32_len1024; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix2_sR_f32_len2048; - extern const csky_vdsp2_cfft_instance_f32 csky_vdsp2_cfft_radix2_sR_f32_len4096; - - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_sR_q31_len16; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_sR_q31_len32; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_sR_q31_len64; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_sR_q31_len128; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_sR_q31_len256; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_sR_q31_len512; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_sR_q31_len1024; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_sR_q31_len2048; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_sR_q31_len4096; - - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_sR_q15_len16; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_sR_q15_len32; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_sR_q15_len64; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_sR_q15_len128; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_sR_q15_len256; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_sR_q15_len512; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_sR_q15_len1024; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_sR_q15_len2048; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_sR_q15_len4096; - - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_fast_sR_q15_len16; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_fast_sR_q15_len32; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_fast_sR_q15_len64; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_fast_sR_q15_len128; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_fast_sR_q15_len256; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_fast_sR_q15_len512; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_fast_sR_q15_len1024; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_fast_sR_q15_len2048; - extern const csky_vdsp2_cfft_instance_q15 csky_vdsp2_cfft_fast_sR_q15_len4096; - - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_fast_sR_q31_len16; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_fast_sR_q31_len32; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_fast_sR_q31_len64; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_fast_sR_q31_len128; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_fast_sR_q31_len256; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_fast_sR_q31_len512; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_fast_sR_q31_len1024; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_fast_sR_q31_len2048; - extern const csky_vdsp2_cfft_instance_q31 csky_vdsp2_cfft_fast_sR_q31_len4096; - - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_rfft_sR_q15_len32; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_rfft_sR_q15_len64; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_rfft_sR_q15_len128; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_rfft_sR_q15_len256; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_rfft_sR_q15_len512; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_rfft_sR_q15_len1024; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_rfft_sR_q15_len2048; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_rfft_sR_q15_len4096; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_rfft_sR_q15_len8192; - - - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_inv_rfft_sR_q15_len32; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_inv_rfft_sR_q15_len64; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_inv_rfft_sR_q15_len128; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_inv_rfft_sR_q15_len256; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_inv_rfft_sR_q15_len512; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_inv_rfft_sR_q15_len1024; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_inv_rfft_sR_q15_len2048; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_inv_rfft_sR_q15_len4096; - extern csky_vdsp2_rfft_instance_q15 csky_vdsp2_inv_rfft_sR_q15_len8192; - - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_rfft_fast_sR_q15_len32; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_rfft_fast_sR_q15_len64; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_rfft_fast_sR_q15_len128; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_rfft_fast_sR_q15_len256; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_rfft_fast_sR_q15_len512; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_rfft_fast_sR_q15_len1024; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_rfft_fast_sR_q15_len2048; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_rfft_fast_sR_q15_len4096; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_rfft_fast_sR_q15_len8192; - - - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_inv_rfft_fast_sR_q15_len32; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_inv_rfft_fast_sR_q15_len64; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_inv_rfft_fast_sR_q15_len128; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_inv_rfft_fast_sR_q15_len256; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_inv_rfft_fast_sR_q15_len512; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_inv_rfft_fast_sR_q15_len1024; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_inv_rfft_fast_sR_q15_len2048; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_inv_rfft_fast_sR_q15_len4096; - extern csky_vdsp2_rfft_fast_instance_q15 csky_vdsp2_inv_rfft_fast_sR_q15_len8192; - - - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_rfft_sR_q31_len32; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_rfft_sR_q31_len64; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_rfft_sR_q31_len128; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_rfft_sR_q31_len256; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_rfft_sR_q31_len512; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_rfft_sR_q31_len1024; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_rfft_sR_q31_len2048; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_rfft_sR_q31_len4096; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_rfft_sR_q31_len8192; - - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_inv_rfft_sR_q31_len32; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_inv_rfft_sR_q31_len64; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_inv_rfft_sR_q31_len128; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_inv_rfft_sR_q31_len256; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_inv_rfft_sR_q31_len512; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_inv_rfft_sR_q31_len1024; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_inv_rfft_sR_q31_len2048; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_inv_rfft_sR_q31_len4096; - extern csky_vdsp2_rfft_instance_q31 csky_vdsp2_inv_rfft_sR_q31_len8192; - - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_rfft_fast_sR_q31_len32; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_rfft_fast_sR_q31_len64; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_rfft_fast_sR_q31_len128; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_rfft_fast_sR_q31_len256; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_rfft_fast_sR_q31_len512; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_rfft_fast_sR_q31_len1024; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_rfft_fast_sR_q31_len2048; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_rfft_fast_sR_q31_len4096; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_rfft_fast_sR_q31_len8192; - - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_inv_rfft_fast_sR_q31_len32; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_inv_rfft_fast_sR_q31_len64; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_inv_rfft_fast_sR_q31_len128; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_inv_rfft_fast_sR_q31_len256; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_inv_rfft_fast_sR_q31_len512; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_inv_rfft_fast_sR_q31_len1024; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_inv_rfft_fast_sR_q31_len2048; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_inv_rfft_fast_sR_q31_len4096; - extern csky_vdsp2_rfft_fast_instance_q31 csky_vdsp2_inv_rfft_fast_sR_q31_len8192; - - - extern csky_vdsp2_rfft_fast_instance_f32 csky_vdsp2_rfft_sR_f32_len32; - extern csky_vdsp2_rfft_fast_instance_f32 csky_vdsp2_rfft_sR_f32_len64; - extern csky_vdsp2_rfft_fast_instance_f32 csky_vdsp2_rfft_sR_f32_len128; - extern csky_vdsp2_rfft_fast_instance_f32 csky_vdsp2_rfft_sR_f32_len256; - extern csky_vdsp2_rfft_fast_instance_f32 csky_vdsp2_rfft_sR_f32_len512; - extern csky_vdsp2_rfft_fast_instance_f32 csky_vdsp2_rfft_sR_f32_len1024; - extern csky_vdsp2_rfft_fast_instance_f32 csky_vdsp2_rfft_sR_f32_len2048; - extern csky_vdsp2_rfft_fast_instance_f32 csky_vdsp2_rfft_sR_f32_len4096; - extern csky_vdsp2_rfft_fast_instance_f32 csky_vdsp2_rfft_sR_f32_len8192; - - extern csky_vdsp2_dct4_instance_q15 csky_vdsp2_dct4_sR_q15_len128; - extern csky_vdsp2_dct4_instance_q15 csky_vdsp2_dct4_sR_q15_len512; - extern csky_vdsp2_dct4_instance_q15 csky_vdsp2_dct4_sR_q15_len2048; - extern csky_vdsp2_dct4_instance_q15 csky_vdsp2_dct4_sR_q15_len8192; - - extern csky_vdsp2_dct4_instance_q31 csky_vdsp2_dct4_sR_q31_len128; - extern csky_vdsp2_dct4_instance_q31 csky_vdsp2_dct4_sR_q31_len512; - extern csky_vdsp2_dct4_instance_q31 csky_vdsp2_dct4_sR_q31_len2048; - extern csky_vdsp2_dct4_instance_q31 csky_vdsp2_dct4_sR_q31_len8192; - - extern csky_vdsp2_dct4_fast_instance_q15 csky_vdsp2_dct4_fast_sR_q15_len128; - extern csky_vdsp2_dct4_fast_instance_q15 csky_vdsp2_dct4_fast_sR_q15_len512; - extern csky_vdsp2_dct4_fast_instance_q15 csky_vdsp2_dct4_fast_sR_q15_len2048; - extern csky_vdsp2_dct4_fast_instance_q15 csky_vdsp2_dct4_fast_sR_q15_len8192; - - extern csky_vdsp2_dct4_fast_instance_q31 csky_vdsp2_dct4_fast_sR_q31_len128; - extern csky_vdsp2_dct4_fast_instance_q31 csky_vdsp2_dct4_fast_sR_q31_len512; - extern csky_vdsp2_dct4_fast_instance_q31 csky_vdsp2_dct4_fast_sR_q31_len2048; - extern csky_vdsp2_dct4_fast_instance_q31 csky_vdsp2_dct4_fast_sR_q31_len8192; - - extern csky_vdsp2_dct4_instance_f32 csky_vdsp2_dct4_sR_f32_len128; - extern csky_vdsp2_dct4_instance_f32 csky_vdsp2_dct4_sR_f32_len512; - extern csky_vdsp2_dct4_instance_f32 csky_vdsp2_dct4_sR_f32_len2048; - extern csky_vdsp2_dct4_instance_f32 csky_vdsp2_dct4_sR_f32_len8192; -#endif diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_vdsp2_math.h b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_vdsp2_math.h deleted file mode 100644 index 55ced0f4..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/include/dsp/csky_vdsp2_math.h +++ /dev/null @@ -1,2378 +0,0 @@ -/* - * Copyright (C) 2016-2019 C-SKY Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/****************************************************************************** - * @file csky_vdsp2_math.h - * @brief Public header file for CSI DSP Library. - * @version V1.0 - * @date 20. Dec 2016 - ******************************************************************************/ - -#ifndef _CSKY_VDSP2_MATH_H -#define _CSKY_VDSP2_MATH_H - -#include <stdint.h> -#include <string.h> - -#ifdef CSKY_VDSP2_MATH_DSP -#include "csi_core.h" -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - /** - * @brief 8-bit fractional data type in 1.7 format. - */ - typedef int8_t q7_t; - - /** - * @brief 16-bit fractional data type in 1.15 format. - */ - typedef int16_t q15_t; - - /** - * @brief 32-bit fractional data type in 1.31 format. - */ - typedef int32_t q31_t; - - /** - * @brief 64-bit fractional data type in 1.63 format. - */ - typedef int64_t q63_t; - - /** - * @brief 32-bit floating-point type definition. - */ - typedef float float32_t; - - /** - * @brief Error status returned by some functions in the library. - */ - - typedef enum - { - CSKY_VDSP2_MATH_SUCCESS = 0, /**< No error */ - CSKY_VDSP2_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ - CSKY_VDSP2_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ - CSKY_VDSP2_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ - CSKY_VDSP2_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ - CSKY_VDSP2_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ - CSKY_VDSP2_MATH_TEST_FAILURE = -6 /**< Test Failed */ - } csky_vdsp2_status; - - /** - * @brief Instance structure for the Q7 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } csky_vdsp2_fir_instance_q7; - - /** - * @brief Instance structure for the Q15 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } csky_vdsp2_fir_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } csky_vdsp2_fir_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } csky_vdsp2_fir_instance_f32; - - void csky_vdsp2_fir_q7( - const csky_vdsp2_fir_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fir_init_q7( - csky_vdsp2_fir_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - uint32_t blockSize); - - void csky_vdsp2_fir_q15( - const csky_vdsp2_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fir_fast_q15( - const csky_vdsp2_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - csky_vdsp2_status csky_vdsp2_fir_init_q15( - csky_vdsp2_fir_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - void csky_vdsp2_fir_q31( - const csky_vdsp2_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fir_fast_q31( - const csky_vdsp2_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fir_init_q31( - csky_vdsp2_fir_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - void csky_vdsp2_fir_f32( - const csky_vdsp2_fir_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fir_init_f32( - csky_vdsp2_fir_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 Biquad cascade filter. - */ - typedef struct - { - int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - } csky_vdsp2_biquad_casd_df1_inst_q15; - - /** - * @brief Instance structure for the Q31 Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - } csky_vdsp2_biquad_casd_df1_inst_q31; - - /** - * @brief Instance structure for the Q31 Biquad cascade filter. - */ - - /** - * @brief Instance structure for the floating-point Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - } csky_vdsp2_biquad_casd_df1_inst_f32; - - void csky_vdsp2_biquad_cascade_df1_q15( - const csky_vdsp2_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_biquad_cascade_df1_init_q15( - csky_vdsp2_biquad_casd_df1_inst_q15 * S, - uint8_t numStages, - q15_t * pCoeffs, - q15_t * pState, - int8_t postShift); - - void csky_vdsp2_biquad_cascade_df1_fast_q15( - const csky_vdsp2_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_biquad_cascade_df1_q31( - const csky_vdsp2_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_biquad_cascade_df1_fast_q31( - const csky_vdsp2_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_biquad_cascade_df1_init_q31( - csky_vdsp2_biquad_casd_df1_inst_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q31_t * pState, - int8_t postShift); - - void csky_vdsp2_biquad_cascade_df1_f32( - const csky_vdsp2_biquad_casd_df1_inst_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_biquad_cascade_df1_init_f32( - csky_vdsp2_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Instance structure for the floating-point matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float32_t *pData; /**< points to the data of the matrix. */ - } csky_vdsp2_matrix_instance_f32; - - /** - * @brief Instance structure for the Q15 matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q15_t *pData; /**< points to the data of the matrix. */ - } csky_vdsp2_matrix_instance_q15; - - /** - * @brief Instance structure for the Q31 matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q31_t *pData; /**< points to the data of the matrix. */ - } csky_vdsp2_matrix_instance_q31; - - csky_vdsp2_status csky_vdsp2_mat_add_f32( - const csky_vdsp2_matrix_instance_f32 * pSrcA, - const csky_vdsp2_matrix_instance_f32 * pSrcB, - csky_vdsp2_matrix_instance_f32 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_add_q15( - const csky_vdsp2_matrix_instance_q15 * pSrcA, - const csky_vdsp2_matrix_instance_q15 * pSrcB, - csky_vdsp2_matrix_instance_q15 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_add_q31( - const csky_vdsp2_matrix_instance_q31 * pSrcA, - const csky_vdsp2_matrix_instance_q31 * pSrcB, - csky_vdsp2_matrix_instance_q31 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_cmplx_mult_f32( - const csky_vdsp2_matrix_instance_f32 * pSrcA, - const csky_vdsp2_matrix_instance_f32 * pSrcB, - csky_vdsp2_matrix_instance_f32 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_cmplx_mult_q15( - const csky_vdsp2_matrix_instance_q15 * pSrcA, - const csky_vdsp2_matrix_instance_q15 * pSrcB, - csky_vdsp2_matrix_instance_q15 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_cmplx_mult_q31( - const csky_vdsp2_matrix_instance_q31 * pSrcA, - const csky_vdsp2_matrix_instance_q31 * pSrcB, - csky_vdsp2_matrix_instance_q31 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_trans_f32( - const csky_vdsp2_matrix_instance_f32 * pSrc, - csky_vdsp2_matrix_instance_f32 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_trans_q15( - const csky_vdsp2_matrix_instance_q15 * pSrc, - csky_vdsp2_matrix_instance_q15 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_trans_q31( - const csky_vdsp2_matrix_instance_q31 * pSrc, - csky_vdsp2_matrix_instance_q31 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_mult_f32( - const csky_vdsp2_matrix_instance_f32 * pSrcA, - const csky_vdsp2_matrix_instance_f32 * pSrcB, - csky_vdsp2_matrix_instance_f32 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_mult_trans_f32( - const csky_vdsp2_matrix_instance_f32 * pSrcA, - const csky_vdsp2_matrix_instance_f32 * pSrcB, - csky_vdsp2_matrix_instance_f32 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_mult_q15( - const csky_vdsp2_matrix_instance_q15 * pSrcA, - const csky_vdsp2_matrix_instance_q15 * pSrcB, - csky_vdsp2_matrix_instance_q15 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_mult_trans_q15( - const csky_vdsp2_matrix_instance_q15 * pSrcA, - const csky_vdsp2_matrix_instance_q15 * pSrcB, - csky_vdsp2_matrix_instance_q15 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_mult_q31( - const csky_vdsp2_matrix_instance_q31 * pSrcA, - const csky_vdsp2_matrix_instance_q31 * pSrcB, - csky_vdsp2_matrix_instance_q31 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_mult_trans_q31( - const csky_vdsp2_matrix_instance_q31 * pSrcA, - const csky_vdsp2_matrix_instance_q31 * pSrcB, - csky_vdsp2_matrix_instance_q31 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_sub_f32( - const csky_vdsp2_matrix_instance_f32 * pSrcA, - const csky_vdsp2_matrix_instance_f32 * pSrcB, - csky_vdsp2_matrix_instance_f32 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_sub_q15( - const csky_vdsp2_matrix_instance_q15 * pSrcA, - const csky_vdsp2_matrix_instance_q15 * pSrcB, - csky_vdsp2_matrix_instance_q15 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_sub_q31( - const csky_vdsp2_matrix_instance_q31 * pSrcA, - const csky_vdsp2_matrix_instance_q31 * pSrcB, - csky_vdsp2_matrix_instance_q31 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_scale_f32( - const csky_vdsp2_matrix_instance_f32 * pSrc, - float32_t scale, - csky_vdsp2_matrix_instance_f32 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_scale_q15( - const csky_vdsp2_matrix_instance_q15 * pSrc, - q15_t scaleFract, - int32_t shift, - csky_vdsp2_matrix_instance_q15 * pDst); - - csky_vdsp2_status csky_vdsp2_mat_scale_q31( - const csky_vdsp2_matrix_instance_q31 * pSrc, - q31_t scaleFract, - int32_t shift, - csky_vdsp2_matrix_instance_q31 * pDst); - - void csky_vdsp2_mat_init_q31( - csky_vdsp2_matrix_instance_q31 * S, - uint16_t nRows, - uint16_t nColumns, - q31_t * pData); - - void csky_vdsp2_mat_init_q15( - csky_vdsp2_matrix_instance_q15 * S, - uint16_t nRows, - uint16_t nColumns, - q15_t * pData); - - void csky_vdsp2_mat_init_f32( - csky_vdsp2_matrix_instance_f32 * S, - uint16_t nRows, - uint16_t nColumns, - float32_t * pData); - - void csky_vdsp2_mult_q15xq31_sht( - q15_t * pSrcA, - q31_t * pSrcB, - uint32_t shiftValue, - uint32_t blockSize); - - void csky_vdsp2_mult_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_mult_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_mult_rnd_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_mult_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_mult_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } csky_vdsp2_cfft_radix2_instance_q15; - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } csky_vdsp2_cfft_radix4_instance_q15; - - /** - * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } csky_vdsp2_cfft_radix2_instance_q31; - - /** - * @brief Instance structure for the Q31 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } csky_vdsp2_cfft_radix4_instance_q31; - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } csky_vdsp2_cfft_radix2_instance_f32; - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } csky_vdsp2_cfft_radix4_instance_f32; - - /** - * @brief Instance structure for the fixed-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } csky_vdsp2_cfft_instance_q15; - -void csky_vdsp2_cfft_q15( - const csky_vdsp2_cfft_instance_q15 * S, - q15_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -void csky_vdsp2_cfft_fast_q15( - const csky_vdsp2_cfft_instance_q15 * S, - q15_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the fixed-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } csky_vdsp2_cfft_instance_q31; - -void csky_vdsp2_cfft_q31( - const csky_vdsp2_cfft_instance_q31 * S, - q31_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -void csky_vdsp2_cfft_fast_q31( - const csky_vdsp2_cfft_instance_q31 * S, - q31_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } csky_vdsp2_cfft_instance_f32; - - void csky_vdsp2_cfft_f32( - const csky_vdsp2_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the Q15 RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const csky_vdsp2_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } csky_vdsp2_rfft_instance_q15; - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - q15_t *pTwiddleAReal; /**< points to the A real twiddle factor table. */ - q15_t *pTwiddleBReal; /**< points to the B real twiddle factor table. */ - const csky_vdsp2_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } csky_vdsp2_rfft_fast_instance_q15; - - csky_vdsp2_status csky_vdsp2_rfft_init_q15( - csky_vdsp2_rfft_instance_q15 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void csky_vdsp2_rfft_q15( - const csky_vdsp2_rfft_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst); - - void csky_vdsp2_rfft_fast_q15( - const csky_vdsp2_rfft_fast_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst); - - /** - * @brief Instance structure for the Q31 RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const csky_vdsp2_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } csky_vdsp2_rfft_instance_q31; - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - q31_t *pTwiddleAReal; /**< points to the A real twiddle factor table. */ - q31_t *pTwiddleBReal; /**< points to the B real twiddle factor table. */ - const csky_vdsp2_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } csky_vdsp2_rfft_fast_instance_q31; - - csky_vdsp2_status csky_vdsp2_rfft_init_q31( - csky_vdsp2_rfft_instance_q31 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void csky_vdsp2_rfft_q31( - const csky_vdsp2_rfft_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst); - - void csky_vdsp2_rfft_fast_q31( - const csky_vdsp2_rfft_fast_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst); - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint16_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - csky_vdsp2_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } csky_vdsp2_rfft_instance_f32; - - csky_vdsp2_status csky_vdsp2_rfft_init_f32( - csky_vdsp2_rfft_instance_f32 * S, - csky_vdsp2_cfft_radix4_instance_f32 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void csky_vdsp2_cfft_radix4_f32( - const csky_vdsp2_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag, - float32_t onebyfftLen); - - void csky_vdsp2_cfft_fast_radix4_f32( - const csky_vdsp2_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag, - float32_t onebyfftLen); - - void csky_vdsp2_cfft_radix2_f32( - const csky_vdsp2_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag, - float32_t onebyfftLen); - - void csky_vdsp2_rfft_f32( - const csky_vdsp2_rfft_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst); - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ -typedef struct - { - csky_vdsp2_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ - uint16_t fftLenRFFT; /**< length of the real sequence */ - float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ - } csky_vdsp2_rfft_fast_instance_f32 ; - -csky_vdsp2_status csky_vdsp2_rfft_fast_init_f32 ( - csky_vdsp2_rfft_fast_instance_f32 * S, - uint16_t fftLen); - -void csky_vdsp2_rfft_fast_f32( - csky_vdsp2_rfft_fast_instance_f32 * S, - float32_t * p, float32_t * pOut, - uint8_t ifftFlag); - - /** - * @brief Instance structure for the floating-point DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - float32_t normalize; /**< normalizing factor. */ - float32_t *pTwiddle; /**< points to the twiddle factor table. */ - float32_t *pCosFactor; /**< points to the cosFactor table. */ - csky_vdsp2_rfft_fast_instance_f32 *pRfft; /**< points to the real FFT fast instance. */ - csky_vdsp2_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } csky_vdsp2_dct4_instance_f32; - - csky_vdsp2_status csky_vdsp2_dct4_init_f32( - csky_vdsp2_dct4_instance_f32 * S, - csky_vdsp2_rfft_fast_instance_f32 * S_RFFT, - csky_vdsp2_cfft_radix4_instance_f32 * S_CFFT, - uint16_t N, - uint16_t Nby2, - float32_t normalize); - - void csky_vdsp2_dct4_f32( - const csky_vdsp2_dct4_instance_f32 * S, - float32_t * pState, - float32_t * pInlineBuffer); - - - /** - * @brief Instance structure for the Q31 DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q31_t normalize; /**< normalizing factor. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - q31_t *pCosFactor; /**< points to the cosFactor table. */ - csky_vdsp2_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ - csky_vdsp2_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } csky_vdsp2_dct4_instance_q31; - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q31_t normalize; /**< normalizing factor. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - q31_t *pCosFactor; /**< points to the cosFactor table. */ - csky_vdsp2_rfft_fast_instance_q31 *pRfft; /**< points to the real FFT instance. */ - csky_vdsp2_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } csky_vdsp2_dct4_fast_instance_q31; - - csky_vdsp2_status csky_vdsp2_dct4_init_q31( - csky_vdsp2_dct4_instance_q31 * S, - csky_vdsp2_rfft_instance_q31 * S_RFFT, - csky_vdsp2_cfft_radix4_instance_q31 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q31_t normalize); - - void csky_vdsp2_dct4_q31( - const csky_vdsp2_dct4_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - - void csky_vdsp2_dct4_fast_q31( - const csky_vdsp2_dct4_fast_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - - /** - * @brief Instance structure for the Q15 DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q15_t normalize; /**< normalizing factor. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - q15_t *pCosFactor; /**< points to the cosFactor table. */ - csky_vdsp2_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ - csky_vdsp2_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } csky_vdsp2_dct4_instance_q15; - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q15_t normalize; /**< normalizing factor. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - q15_t *pCosFactor; /**< points to the cosFactor table. */ - csky_vdsp2_rfft_fast_instance_q15 *pRfft; /**< points to the real FFT instance. */ - csky_vdsp2_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } csky_vdsp2_dct4_fast_instance_q15; - - csky_vdsp2_status csky_vdsp2_dct4_init_q15( - csky_vdsp2_dct4_instance_q15 * S, - csky_vdsp2_rfft_instance_q15 * S_RFFT, - csky_vdsp2_cfft_radix4_instance_q15 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q15_t normalize); - - void csky_vdsp2_dct4_q15( - const csky_vdsp2_dct4_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer); - - void csky_vdsp2_dct4_fast_q15( - const csky_vdsp2_dct4_fast_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer); - - void csky_vdsp2_add_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_add_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_add_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_add_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_sub_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_sub_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_sub_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_sub_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_sum_q15( - q15_t * pSrcA, - q63_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_scale_f32( - float32_t * pSrc, - float32_t scale, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_scale_q7( - q7_t * pSrc, - q7_t scaleFract, - int8_t shift, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_scale_q15( - q15_t * pSrc, - q15_t scaleFract, - int8_t shift, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_scale_q31( - q31_t * pSrc, - q31_t scaleFract, - int8_t shift, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_abs_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_abs_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_abs_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_abs_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_abs_max_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_abs_max_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - void csky_vdsp2_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t blockSize, - float32_t * result); - - void csky_vdsp2_dot_prod_q7( - q7_t * pSrcA, - q7_t * pSrcB, - uint32_t blockSize, - q31_t * result); - - void csky_vdsp2_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - void csky_vdsp2_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - void csky_vdsp2_dot_prod_u64xu8( - uint8_t * pSrcA, - uint64_t * pSrcB, - uint32_t blockSize, - uint64_t * result); - - void csky_vdsp2_shift_q7( - q7_t * pSrc, - int8_t shiftBits, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_shift_q15( - q15_t * pSrc, - int8_t shiftBits, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_shift_q31( - q31_t * pSrc, - int8_t shiftBits, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_offset_f32( - float32_t * pSrc, - float32_t offset, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_offset_q7( - q7_t * pSrc, - q7_t offset, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_offset_q15( - q15_t * pSrc, - q15_t offset, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_offset_q31( - q31_t * pSrc, - q31_t offset, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_negate_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_negate_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_negate_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_negate_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_copy_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_copy_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_copy_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_copy_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fill_f32( - float32_t value, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fill_q7( - q7_t value, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fill_q15( - q15_t value, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fill_q31( - q31_t value, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_conv_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - void csky_vdsp2_conv_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - void csky_vdsp2_conv_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - void csky_vdsp2_conv_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - void csky_vdsp2_conv_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - void csky_vdsp2_conv_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - void csky_vdsp2_conv_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - void csky_vdsp2_conv_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - void csky_vdsp2_conv_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - csky_vdsp2_status csky_vdsp2_conv_partial_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - csky_vdsp2_status csky_vdsp2_conv_partial_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - csky_vdsp2_status csky_vdsp2_conv_partial_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - csky_vdsp2_status csky_vdsp2_conv_partial_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - csky_vdsp2_status csky_vdsp2_conv_partial_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - csky_vdsp2_status csky_vdsp2_conv_partial_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - csky_vdsp2_status csky_vdsp2_conv_partial_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - csky_vdsp2_status csky_vdsp2_conv_partial_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - csky_vdsp2_status csky_vdsp2_conv_partial_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - /** - * @brief Instance structure for the Q15 FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } csky_vdsp2_fir_decimate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } csky_vdsp2_fir_decimate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } csky_vdsp2_fir_decimate_instance_f32; - - void csky_vdsp2_fir_decimate_f32( - const csky_vdsp2_fir_decimate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - csky_vdsp2_status csky_vdsp2_fir_decimate_init_f32( - csky_vdsp2_fir_decimate_instance_f32 * S, - uint16_t numTaps, - uint8_t M, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - void csky_vdsp2_fir_decimate_q15( - const csky_vdsp2_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fir_decimate_fast_q15( - const csky_vdsp2_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - csky_vdsp2_status csky_vdsp2_fir_decimate_init_q15( - csky_vdsp2_fir_decimate_instance_q15 * S, - uint16_t numTaps, - uint8_t M, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - void csky_vdsp2_fir_decimate_q31( - const csky_vdsp2_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fir_decimate_fast_q31( - csky_vdsp2_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - csky_vdsp2_status csky_vdsp2_fir_decimate_init_q31( - csky_vdsp2_fir_decimate_instance_q31 * S, - uint16_t numTaps, - uint8_t M, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } csky_vdsp2_fir_interpolate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } csky_vdsp2_fir_interpolate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ - } csky_vdsp2_fir_interpolate_instance_f32; - - void csky_vdsp2_fir_interpolate_q15( - const csky_vdsp2_fir_interpolate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - csky_vdsp2_status csky_vdsp2_fir_interpolate_init_q15( - csky_vdsp2_fir_interpolate_instance_q15 * S, - uint8_t L, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - void csky_vdsp2_fir_interpolate_q31( - const csky_vdsp2_fir_interpolate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - csky_vdsp2_status csky_vdsp2_fir_interpolate_init_q31( - csky_vdsp2_fir_interpolate_instance_q31 * S, - uint8_t L, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - void csky_vdsp2_fir_interpolate_f32( - const csky_vdsp2_fir_interpolate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - csky_vdsp2_status csky_vdsp2_fir_interpolate_init_f32( - csky_vdsp2_fir_interpolate_instance_f32 * S, - uint8_t L, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } csky_vdsp2_biquad_cascade_df2T_instance_f32; - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } csky_vdsp2_biquad_cascade_stereo_df2T_instance_f32; - - void csky_vdsp2_biquad_cascade_df2T_f32( - const csky_vdsp2_biquad_cascade_df2T_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_biquad_cascade_stereo_df2T_f32( - const csky_vdsp2_biquad_cascade_stereo_df2T_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_biquad_cascade_df2T_init_f32( - csky_vdsp2_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - void csky_vdsp2_biquad_cascade_stereo_df2T_init_f32( - csky_vdsp2_biquad_cascade_stereo_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - /** - * @brief Instance structure for the Q15 FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } csky_vdsp2_fir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } csky_vdsp2_fir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } csky_vdsp2_fir_lattice_instance_f32; - - void csky_vdsp2_fir_lattice_init_q15( - csky_vdsp2_fir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pCoeffs, - q15_t * pState); - - void csky_vdsp2_fir_lattice_q15( - const csky_vdsp2_fir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fir_lattice_init_q31( - csky_vdsp2_fir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pCoeffs, - q31_t * pState); - - void csky_vdsp2_fir_lattice_q31( - const csky_vdsp2_fir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_fir_lattice_init_f32( - csky_vdsp2_fir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - void csky_vdsp2_fir_lattice_f32( - const csky_vdsp2_fir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } csky_vdsp2_iir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } csky_vdsp2_iir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } csky_vdsp2_iir_lattice_instance_f32; - - void csky_vdsp2_iir_lattice_f32( - const csky_vdsp2_iir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_iir_lattice_init_f32( - csky_vdsp2_iir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pkCoeffs, - float32_t * pvCoeffs, - float32_t * pState, - uint32_t blockSize); - - void csky_vdsp2_iir_lattice_q31( - const csky_vdsp2_iir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_iir_lattice_init_q31( - csky_vdsp2_iir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pkCoeffs, - q31_t * pvCoeffs, - q31_t * pState, - uint32_t blockSize); - - void csky_vdsp2_iir_lattice_q15( - const csky_vdsp2_iir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_iir_lattice_init_q15( - csky_vdsp2_iir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pkCoeffs, - q15_t * pvCoeffs, - q15_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the floating-point LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that controls filter coefficient updates. */ - } csky_vdsp2_lms_instance_f32; - - void csky_vdsp2_lms_f32( - const csky_vdsp2_lms_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - void csky_vdsp2_lms_init_f32( - csky_vdsp2_lms_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } csky_vdsp2_lms_instance_q15; - - void csky_vdsp2_lms_init_q15( - csky_vdsp2_lms_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint32_t postShift); - - void csky_vdsp2_lms_q15( - const csky_vdsp2_lms_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } csky_vdsp2_lms_instance_q31; - - void csky_vdsp2_lms_q31( - const csky_vdsp2_lms_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - void csky_vdsp2_lms_init_q31( - csky_vdsp2_lms_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint32_t postShift); - - - /** - * @brief Instance structure for the floating-point normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that control filter coefficient updates. */ - float32_t energy; /**< saves previous frame energy. */ - float32_t x0; /**< saves previous input sample. */ - } csky_vdsp2_lms_norm_instance_f32; - - void csky_vdsp2_lms_norm_f32( - csky_vdsp2_lms_norm_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - void csky_vdsp2_lms_norm_init_f32( - csky_vdsp2_lms_norm_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - q31_t *recipTable; /**< points to the reciprocal initial value table. */ - q31_t energy; /**< saves previous frame energy. */ - q31_t x0; /**< saves previous input sample. */ - } csky_vdsp2_lms_norm_instance_q31; - - void csky_vdsp2_lms_norm_q31( - csky_vdsp2_lms_norm_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - void csky_vdsp2_lms_norm_init_q31( - csky_vdsp2_lms_norm_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint8_t postShift); - - - /** - * @brief Instance structure for the Q15 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< Number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - q15_t *recipTable; /**< Points to the reciprocal initial value table. */ - q15_t energy; /**< saves previous frame energy. */ - q15_t x0; /**< saves previous input sample. */ - } csky_vdsp2_lms_norm_instance_q15; - - void csky_vdsp2_lms_norm_q15( - csky_vdsp2_lms_norm_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - void csky_vdsp2_lms_norm_init_q15( - csky_vdsp2_lms_norm_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint8_t postShift); - - void csky_vdsp2_correlate_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - void csky_vdsp2_correlate_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - void csky_vdsp2_correlate_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - void csky_vdsp2_correlate_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - void csky_vdsp2_correlate_fast_opt_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - void csky_vdsp2_correlate_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - void csky_vdsp2_correlate_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - void csky_vdsp2_correlate_opt_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - void csky_vdsp2_correlate_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - - /** - * @brief Instance structure for the floating-point sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } csky_vdsp2_fir_sparse_instance_f32; - - /** - * @brief Instance structure for the Q31 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } csky_vdsp2_fir_sparse_instance_q31; - - /** - * @brief Instance structure for the Q15 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } csky_vdsp2_fir_sparse_instance_q15; - - /** - * @brief Instance structure for the Q7 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } csky_vdsp2_fir_sparse_instance_q7; - - void csky_vdsp2_fir_sparse_f32( - csky_vdsp2_fir_sparse_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - float32_t * pScratchIn, - uint32_t blockSize); - - void csky_vdsp2_fir_sparse_init_f32( - csky_vdsp2_fir_sparse_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - void csky_vdsp2_fir_sparse_q31( - csky_vdsp2_fir_sparse_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - q31_t * pScratchIn, - uint32_t blockSize); - - void csky_vdsp2_fir_sparse_init_q31( - csky_vdsp2_fir_sparse_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - void csky_vdsp2_fir_sparse_q15( - csky_vdsp2_fir_sparse_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - q15_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - void csky_vdsp2_fir_sparse_init_q15( - csky_vdsp2_fir_sparse_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - void csky_vdsp2_fir_sparse_q7( - csky_vdsp2_fir_sparse_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - q7_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - void csky_vdsp2_fir_sparse_init_q7( - csky_vdsp2_fir_sparse_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - void csky_vdsp2_sin_cos_f32( - float32_t theta, - float32_t * pSinVal, - float32_t * pCosVal); - - void csky_vdsp2_sin_cos_q31( - q31_t theta, - q31_t * pSinVal, - q31_t * pCosVal); - - void csky_vdsp2_cmplx_conj_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_conj_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_conj_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mag_squared_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mag_squared_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mag_squared_q31_basic( - q31_t * pSrc, - q63_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mag_squared_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_vsqrt_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_vsqrt_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_vsqrt_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_vsqrt_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_q7_to_q31( - q7_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_q7_to_q15( - q7_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_q7_to_float( - q7_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_q31_to_float( - q31_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - csky_vdsp2_status csky_vdsp2_sqrt_f32( - float32_t in, - float32_t * pOut); - - csky_vdsp2_status csky_vdsp2_sqrt_q31( - q31_t in, - q31_t * pOut); - - csky_vdsp2_status csky_vdsp2_sqrt_q15( - q15_t in, - q15_t * pOut); - - void csky_vdsp2_power_q31( - q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - void csky_vdsp2_power_int32( - int32_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - void csky_vdsp2_power_int32( - int32_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - void csky_vdsp2_power_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - void csky_vdsp2_power_q15( - q15_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - void csky_vdsp2_power_q7( - q7_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - void csky_vdsp2_mean_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult); - - void csky_vdsp2_mean_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - void csky_vdsp2_mean_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - void csky_vdsp2_mean_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - void csky_vdsp2_var_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - void csky_vdsp2_var_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - void csky_vdsp2_var_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - void csky_vdsp2_rms_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - void csky_vdsp2_rms_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - void csky_vdsp2_rms_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - void csky_vdsp2_std_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - void csky_vdsp2_std_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - void csky_vdsp2_std_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - void csky_vdsp2_cmplx_mag_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mag_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mag_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t numSamples, - q31_t * realResult, - q31_t * imagResult); - - void csky_vdsp2_cmplx_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t numSamples, - q63_t * realResult, - q63_t * imagResult); - - void csky_vdsp2_cmplx_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t numSamples, - float32_t * realResult, - float32_t * imagResult); - - void csky_vdsp2_cmplx_mult_real_q15( - q15_t * pSrcCmplx, - q15_t * pSrcReal, - q15_t * pCmplxDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mult_real_q31( - q31_t * pSrcCmplx, - q31_t * pSrcReal, - q31_t * pCmplxDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mult_real_f32( - float32_t * pSrcCmplx, - float32_t * pSrcReal, - float32_t * pCmplxDst, - uint32_t numSamples); - - void csky_vdsp2_min_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * result, - uint32_t * index); - - void csky_vdsp2_min_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - void csky_vdsp2_min_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - void csky_vdsp2_min_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - void csky_vdsp2_max_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex); - - void csky_vdsp2_max_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - void csky_vdsp2_max_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - void csky_vdsp2_max_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - void csky_vdsp2_cmplx_mult_cmplx_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mult_cmplx_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mult_cmplx_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mult_cmplx_re_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mult_cmplx_re_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t numSamples); - - void csky_vdsp2_cmplx_mult_cmplx_re_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - - - void csky_vdsp2_float_to_q31( - float32_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_float_to_q15( - float32_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_float_to_q7( - float32_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_q31_to_q15( - q31_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_q31_to_q7( - q31_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_q31_to_q7_rs( - q31_t * pSrc, - q7_t * pDst, - uint32_t shiftValue, - uint32_t blockSize); - - void csky_vdsp2_q63_to_q31_rs( - q63_t * pSrc, - q31_t * pDst, - uint32_t shiftValue, - uint32_t blockSize); - - void csky_vdsp2_q15_to_float( - q15_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_q15_to_q31( - q15_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - void csky_vdsp2_q15_to_q7( - q15_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - -#ifdef __cplusplus -} -#endif -#endif /* _CSKY_VDSP2_MATH_H */ - -/** - * - * End of file. - */ diff --git a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/src/csi_ringbuf.c b/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/src/csi_ringbuf.c deleted file mode 100644 index 364b682c..00000000 --- a/ports/xuantie/e906/gnu/example_build/smartl_fpga/components/csi/csi2/src/csi_ringbuf.c +++ /dev/null @@ -1,184 +0,0 @@ -#include <string.h> -#include <stdlib.h> -#include <stdbool.h> -#include <csi_core.h> -#include "drv/ringbuf.h" - -#define min(a, b) (((a) < (b)) ? (a) : (b)) - -/** - * \brief Removes the entire FIFO contents. - * \param [in] fifo: The fifo to be emptied. - * \return None. - */ -void csi_ringbuf_reset(csi_ringbuf_t *fifo) -{ - uint32_t stat = csi_irq_save(); - fifo->write = fifo->read = 0; - fifo->data_len = 0; - csi_irq_restore(stat); -} - -/** - * \brief Returns the size of the FIFO in bytes. - * \param [in] fifo: The fifo to be used. - * \return The size of the FIFO. - */ -static inline uint32_t csi_ringbuf_size(csi_ringbuf_t *fifo) -{ - return fifo->size; -} - -/** - * \brief Returns the number of used bytes in the FIFO. - * \param [in] fifo: The fifo to be used. - * \return The number of used bytes. - */ -uint32_t csi_ringbuf_len(csi_ringbuf_t *fifo) -{ - return fifo->data_len; -} - -/** - * \brief Returns the number of bytes available in the FIFO. - * \param [in] fifo: The fifo to be used. - * \return The number of bytes available. - */ -uint32_t csi_ringbuf_avail(csi_ringbuf_t *fifo) -{ - return csi_ringbuf_size(fifo) - csi_ringbuf_len(fifo); -} - -/** - * \brief Is the FIFO empty? - * \param [in] fifo: The fifo to be used. - * \retval true: Yes. - * \retval false: No. - */ -bool csi_ringbuf_is_empty(csi_ringbuf_t *fifo) -{ - return csi_ringbuf_len(fifo) == 0; -} - -/** - * \brief Is the FIFO full? - * \param [in] fifo: The fifo to be used. - * \retval true: Yes. - * \retval false: No. - */ -bool csi_ringbuf_is_full(csi_ringbuf_t *fifo) -{ - return csi_ringbuf_avail(fifo) == 0; -} - -/** - * \brief Puts some data into the FIFO. - * \param [in] fifo: The fifo to be used. - * \param [in] in: The data to be added. - * \param [in] len: The length of the data to be added. - * \return The number of bytes copied. - * \note This function copies at most @len bytes from the @in into - * the FIFO depending on the free space, and returns the number - * of bytes copied. - */ -uint32_t csi_ringbuf_in(csi_ringbuf_t *fifo, const void *datptr, uint32_t len) -{ - uint32_t writelen = 0, tmplen = 0; - - if(csi_ringbuf_is_full(fifo)) - return 0; - - tmplen = fifo->size - fifo->data_len; - writelen = tmplen > len ? len : tmplen; - - if(fifo->write < fifo->read) { - memcpy((void*)&fifo->buffer[fifo->write], (void*)datptr, writelen); - } else { - tmplen = fifo->size - fifo->write; - if(writelen <= tmplen) { - memcpy((void*)&fifo->buffer[fifo->write], (void*)datptr, writelen); - } else { - memcpy((void*)&fifo->buffer[fifo->write], (void*)datptr, tmplen); - memcpy((void*)fifo->buffer, (uint8_t*)datptr + tmplen, writelen - tmplen); - } - } - - uint32_t stat = csi_irq_save(); - fifo->write = (fifo->write + writelen) % fifo->size; - fifo->data_len += writelen; - csi_irq_restore(stat); - - return writelen; -} - -/** - * \brief Gets some data from the FIFO. - * \param [in] fifo: The fifo to be used. - * \param [in] out: Where the data must be copied. - * \param [in] len: The size of the destination buffer. - * \return The number of copied bytes. - * \note This function copies at most @len bytes from the FIFO into - * the @out and returns the number of copied bytes. - */ -uint32_t csi_ringbuf_out(csi_ringbuf_t *fifo, void *outbuf, uint32_t len) -{ - uint32_t readlen = 0, tmplen = 0; - if(csi_ringbuf_is_empty(fifo)) - return 0; - - uint32_t data_len = fifo->data_len; - readlen = len > data_len ? data_len : len; - tmplen = fifo->size - fifo->read; - - if(NULL != outbuf) { - if(readlen <= tmplen) { - memcpy((void*)outbuf, (void*)&fifo->buffer[fifo->read], readlen); - } else { - memcpy((void*)outbuf,(void*)&fifo->buffer[fifo->read], tmplen); - memcpy((uint8_t*)outbuf + tmplen,(void*)fifo->buffer,readlen - tmplen); - } - } - - uint32_t stat = csi_irq_save(); - fifo->read = (fifo->read + readlen) % fifo->size; - fifo->data_len -= readlen; - csi_irq_restore(stat); - - return readlen; -} - -/** - * \brief Move FIFO buffer to another FIFO. - * \param [in] fifo_in: The fifo to be used. - * \param [in] fifo_out: The fifo to be used. - * \return The number of copied bytes. - * \note This function copies at most @len bytes from the FIFO into - * the @out and returns the number of copied bytes. - */ -uint32_t csi_ringbuf_move(csi_ringbuf_t *fifo_in, csi_ringbuf_t *fifo_out) -{ - uint32_t readlen = 0, tmplen_out = 0; - if(csi_ringbuf_is_empty(fifo_out)) - return 0; - - uint32_t len = csi_ringbuf_avail(fifo_in); - - uint32_t data_len = fifo_out->data_len; - readlen = len > data_len ? data_len : len; - tmplen_out = fifo_out->size - fifo_out->read; - - if(readlen <= tmplen_out) { - csi_ringbuf_in(fifo_in, (void*)&fifo_out->buffer[fifo_out->read], readlen); - } else { - csi_ringbuf_in(fifo_in, (void*)&fifo_out->buffer[fifo_out->read], tmplen_out); - csi_ringbuf_in(fifo_in, (void*)fifo_out->buffer, readlen - tmplen_out); - } - - uint32_t stat = csi_irq_save(); - fifo_out->read = (fifo_out->read + readlen) % fifo_out->size; - fifo_out->data_len -= readlen; - csi_irq_restore(stat); - - return readlen; -} - diff --git a/ports/xuantie/e906/gnu/inc/tx_port.h b/ports/xuantie/e906/gnu/inc/tx_port.h deleted file mode 100644 index 50f87587..00000000 --- a/ports/xuantie/e906/gnu/inc/tx_port.h +++ /dev/null @@ -1,361 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2024 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the MIT License which is available at - * https://opensource.org/licenses/MIT. - * - * SPDX-License-Identifier: MIT - **************************************************************************/ - - -/**************************************************************************/ -/**************************************************************************/ -/** */ -/** ThreadX Component */ -/** */ -/** Port Specific */ -/** */ -/**************************************************************************/ -/**************************************************************************/ - - -/**************************************************************************/ -/* */ -/* PORT SPECIFIC C INFORMATION RELEASE */ -/* */ -/* tx_port.h RISC-V64/GNU */ -/* 6.2.1 */ -/* */ -/* AUTHOR */ -/* */ -/* Scott Larson, Microsoft Corporation */ -/* */ -/* DESCRIPTION */ -/* */ -/* This file contains data type definitions that make the ThreadX */ -/* real-time kernel function identically on a variety of different */ -/* processor architectures. For example, the size or number of bits */ -/* in an "int" data type vary between microprocessor architectures and */ -/* even C compilers for the same microprocessor. ThreadX does not */ -/* directly use native C data types. Instead, ThreadX creates its */ -/* own special types that can be mapped to actual data types by this */ -/* file to guarantee consistency in the interface and functionality. */ -/* */ -/* RELEASE HISTORY */ -/* */ -/* DATE NAME DESCRIPTION */ -/* */ -/* 03-08-2023 Scott Larson Initial Version 6.2.1 */ -/* */ -/**************************************************************************/ - -#ifndef TX_PORT_H -#define TX_PORT_H - -#include <stdint.h> -#include <string.h> - -/* Determine if the optional ThreadX user define file should be used. */ - -#ifdef TX_INCLUDE_USER_DEFINE_FILE - - -/* Yes, include the user defines in tx_user.h. The defines in this file may - alternately be defined on the command line. */ - -#include "tx_user.h" -#endif - - -/* Define compiler library include files. */ - - -/* Define ThreadX basic types for this port. */ - -#define VOID void -typedef char CHAR; -typedef unsigned char UCHAR; -typedef int INT; -typedef unsigned int UINT; -typedef long LONG; -typedef unsigned long ULONG; -typedef unsigned long long ULONG64; -typedef short SHORT; -typedef unsigned short USHORT; -#define ULONG64_DEFINED - -#define ALIGN_TYPE_DEFINED -#define ALIGN_TYPE ULONG - - -typedef struct thread_stack_frame { - unsigned long epc; /* epc - epc - program counter */ - unsigned long ra; /* x1 - ra - return address for jumps */ - unsigned long t0; /* x5 - t0 - temporary register 0 */ - unsigned long t1; /* x6 - t1 - temporary register 1 */ - unsigned long t2; /* x7 - t2 - temporary register 2 */ - unsigned long s0_fp; /* x8 - s0/fp - saved register 0 or frame pointer */ - unsigned long s1; /* x9 - s1 - saved register 1 */ - unsigned long a0; /* x10 - a0 - return value or function argument 0 */ - unsigned long a1; /* x11 - a1 - return value or function argument 1 */ - unsigned long a2; /* x12 - a2 - function argument 2 */ - unsigned long a3; /* x13 - a3 - function argument 3 */ - unsigned long a4; /* x14 - a4 - function argument 4 */ - unsigned long a5; /* x15 - a5 - function argument 5 */ - unsigned long a6; /* x16 - a6 - function argument 6 */ - unsigned long a7; /* x17 - s7 - function argument 7 */ - unsigned long s2; /* x18 - s2 - saved register 2 */ - unsigned long s3; /* x19 - s3 - saved register 3 */ - unsigned long s4; /* x20 - s4 - saved register 4 */ - unsigned long s5; /* x21 - s5 - saved register 5 */ - unsigned long s6; /* x22 - s6 - saved register 6 */ - unsigned long s7; /* x23 - s7 - saved register 7 */ - unsigned long s8; /* x24 - s8 - saved register 8 */ - unsigned long s9; /* x25 - s9 - saved register 9 */ - unsigned long s10; /* x26 - s10 - saved register 10 */ - unsigned long s11; /* x27 - s11 - saved register 11 */ - unsigned long t3; /* x28 - t3 - temporary register 3 */ - unsigned long t4; /* x29 - t4 - temporary register 4 */ - unsigned long t5; /* x30 - t5 - temporary register 5 */ - unsigned long t6; /* x31 - t6 - temporary register 6 */ - unsigned long mstatus; /* - machine status register */ -} tx_stack_frame_t; - -typedef struct __attribute__((packed)) { - unsigned long fcsr; -#if __riscv_float_abi_single - unsigned long f[32]; /* f0~f31 */ -#elif __riscv_float_abi_double - unsigned long long f[32]; /* f0~f31 */ -#endif -} tx_stack_f_frame_t; - -typedef struct { - unsigned long vxsat; -} tx_stack_p_frame_t; - -/* Define the priority levels for ThreadX. Legal values range - from 32 to 1024 and MUST be evenly divisible by 32. */ - -#ifndef TX_MAX_PRIORITIES -#define TX_MAX_PRIORITIES 32 -#endif - - -/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during - thread creation is less than this value, the thread create call will return an error. */ - -#ifndef TX_MINIMUM_STACK -#define TX_MINIMUM_STACK 1024 /* Minimum stack size for this port */ -#endif - - -/* Define the system timer thread's default stack size and priority. These are only applicable - if TX_TIMER_PROCESS_IN_ISR is not defined. */ - -#ifndef TX_TIMER_THREAD_STACK_SIZE -#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ -#endif - -#ifndef TX_TIMER_THREAD_PRIORITY -#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ -#endif - - -/* Define various constants for the ThreadX RISC-V port. */ - -#define TX_INT_DISABLE 0x00000000 /* Disable interrupts value */ -#define TX_INT_ENABLE 0x00000008 /* Enable interrupt value */ - - -/* Define the clock source for trace event entry time stamp. The following two item are port specific. - For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock - source constants would be: - -#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) -#define TX_TRACE_TIME_MASK 0x0000FFFFUL - -*/ - -#ifndef TX_TRACE_TIME_SOURCE -#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time -#endif -#ifndef TX_TRACE_TIME_MASK -#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL -#endif - - -/* Define the port specific options for the _tx_build_options variable. This variable indicates - how the ThreadX library was built. */ - -#define TX_PORT_SPECIFIC_BUILD_OPTIONS 0 - - -/* Define the in-line initialization constant so that modules with in-line - initialization capabilities can prevent their initialization from being - a function call. */ - -#define TX_INLINE_INITIALIZATION - - -/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is - disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack - checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING - define is negated, thereby forcing the stack fill which is necessary for the stack checking - logic. */ - -#ifdef TX_ENABLE_STACK_CHECKING -#undef TX_DISABLE_STACK_FILLING -#endif - - - -/* Define the TX_THREAD control block extensions for this port. The main reason - for the multiple macros is so that backward compatibility can be maintained with - existing ThreadX kernel awareness modules. */ - -#define TX_THREAD_EXTENSION_0 -#define TX_THREAD_EXTENSION_1 -#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT -#define TX_THREAD_EXTENSION_2 VOID *tx_thread_module_instance_ptr; \ - VOID *tx_thread_module_entry_info_ptr; \ - ULONG tx_thread_module_current_user_mode; \ - ULONG tx_thread_module_user_mode; \ - ULONG tx_thread_module_saved_lr; \ - VOID *tx_thread_module_kernel_stack_start; \ - VOID *tx_thread_module_kernel_stack_end; \ - ULONG tx_thread_module_kernel_stack_size; \ - VOID *tx_thread_module_stack_ptr; \ - VOID *tx_thread_module_stack_start; \ - VOID *tx_thread_module_stack_end; \ - ULONG tx_thread_module_stack_size; \ - VOID *tx_thread_module_reserved; \ - VOID *tx_thread_iar_tls_pointer; -#else -#define TX_THREAD_EXTENSION_2 VOID *tx_thread_module_instance_ptr; \ - VOID *tx_thread_module_entry_info_ptr; \ - ULONG tx_thread_module_current_user_mode; \ - ULONG tx_thread_module_user_mode; \ - ULONG tx_thread_module_saved_lr; \ - VOID *tx_thread_module_kernel_stack_start; \ - VOID *tx_thread_module_kernel_stack_end; \ - ULONG tx_thread_module_kernel_stack_size; \ - VOID *tx_thread_module_stack_ptr; \ - VOID *tx_thread_module_stack_start; \ - VOID *tx_thread_module_stack_end; \ - ULONG tx_thread_module_stack_size; \ - VOID *tx_thread_module_reserved; -#endif -#ifndef TX_ENABLE_EXECUTION_CHANGE_NOTIFY -#define TX_THREAD_EXTENSION_3 -#else -#define TX_THREAD_EXTENSION_3 unsigned long long tx_thread_execution_time_total; \ - unsigned long long tx_thread_execution_time_last_start; -#endif - - -/* Define the port extensions of the remaining ThreadX objects. */ - -#define TX_BLOCK_POOL_EXTENSION -#define TX_BYTE_POOL_EXTENSION -#define TX_MUTEX_EXTENSION -#define TX_EVENT_FLAGS_GROUP_EXTENSION VOID *tx_event_flags_group_module_instance; \ - VOID (*tx_event_flags_group_set_module_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *group_ptr); - -#define TX_QUEUE_EXTENSION VOID *tx_queue_module_instance; \ - VOID (*tx_queue_send_module_notify)(struct TX_QUEUE_STRUCT *queue_ptr); - -#define TX_SEMAPHORE_EXTENSION VOID *tx_semaphore_module_instance; \ - VOID (*tx_semaphore_put_module_notify)(struct TX_SEMAPHORE_STRUCT *semaphore_ptr); - -#define TX_TIMER_EXTENSION VOID *tx_timer_module_instance; \ - VOID (*tx_timer_module_expiration_function)(ULONG id); - - -/* Define the user extension field of the thread control block. Nothing - additional is needed for this port so it is defined as white space. */ - -#ifndef TX_THREAD_USER_EXTENSION -#define TX_THREAD_USER_EXTENSION -#endif - - - -/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, - tx_thread_shell_entry, and tx_thread_terminate. */ - -#define TX_THREAD_CREATE_EXTENSION(thread_ptr) -#define TX_THREAD_DELETE_EXTENSION(thread_ptr) -#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) -#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) - - -/* Define the ThreadX object creation extensions for the remaining objects. */ - -#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) -#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) -#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) -#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) -#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) -#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) -#define TX_TIMER_CREATE_EXTENSION(timer_ptr) - - -/* Define the ThreadX object deletion extensions for the remaining objects. */ - -#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) -#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) -#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) -#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) -#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) -#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) -#define TX_TIMER_DELETE_EXTENSION(timer_ptr) - - -/* Define ThreadX interrupt lockout and restore macros for protection on - access of critical kernel information. The restore interrupt macro must - restore the interrupt posture of the running thread prior to the value - present prior to the disable macro. In most cases, the save area macro - is used to define a local function save area for the disable and restore - macros. */ - -#ifdef TX_DISABLE_INLINE - -#define TX_INTERRUPT_SAVE_AREA register ULONG interrupt_save; - -#define TX_DISABLE interrupt_save = _tx_thread_interrupt_control(TX_INT_DISABLE); -#define TX_RESTORE _tx_thread_interrupt_control(interrupt_save); - -#else - -#define TX_INTERRUPT_SAVE_AREA ULONG interrupt_save; -/* Atomically read mstatus into interrupt_save and clear bit 3 of mstatus. */ -#define TX_DISABLE {__asm__ volatile ("csrrci %0, mstatus, 0x08" : "=r" (interrupt_save) : : "memory");}; -/* We only care about mstatus.mie (bit 3), so mask interrupt_save and write to mstatus. */ -#define TX_RESTORE {register ULONG __tempmask = interrupt_save & 0x08; \ - __asm__ volatile ("csrrs x0, mstatus, %0 \n\t" : : "r" (__tempmask) : "memory");}; - -#endif - - -/* Define the interrupt lockout macros for each ThreadX object. */ - -#define TX_BLOCK_POOL_DISABLE TX_DISABLE -#define TX_BYTE_POOL_DISABLE TX_DISABLE -#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE -#define TX_MUTEX_DISABLE TX_DISABLE -#define TX_QUEUE_DISABLE TX_DISABLE -#define TX_SEMAPHORE_DISABLE TX_DISABLE - - -/* Define the version ID of ThreadX. This may be utilized by the application. */ - -#ifdef TX_THREAD_INIT -CHAR _tx_version_id[] = - "Copyright (c) 2024 Microsoft Corporation. * ThreadX RISC-V32/GNU Version 6.4.2 *"; -#else -extern CHAR _tx_version_id[]; -#endif - -#endif diff --git a/ports/xuantie/e906/gnu/src/tx_port.c b/ports/xuantie/e906/gnu/src/tx_port.c deleted file mode 100644 index 1fee892a..00000000 --- a/ports/xuantie/e906/gnu/src/tx_port.c +++ /dev/null @@ -1,110 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "tx_api.h" -#include "tx_timer.h" -#include "tx_thread.h" -#include "tx_initialize.h" - -void thread_switch_ext(void) -{ -#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - _tx_execution_thread_exit(); -#endif - - if(!_tx_thread_execute_ptr) { - unsigned long mcause; - __asm__ volatile( - "csrr %0, mcause\n\t" - "csrsi mstatus, 0x8" - : "=r"(mcause) - : - : "memory" - ); - while (!_tx_thread_execute_ptr) { - __asm__ volatile("wfi"); - } - __asm__ volatile( - "csrci mstatus, 0x8\n\t" - "csrw mcause, %0" - : - : "r"(mcause) - : "memory" - ); - } - /* Determine if the time-slice is active. */ - if (_tx_timer_time_slice && _tx_thread_current_ptr) { - /* Preserve current remaining time-slice for the thread and clear the current time-slice. */ - _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; - _tx_timer_time_slice = 0; - } - _tx_thread_current_ptr = _tx_thread_execute_ptr; -} - -VOID _tx_initialize_low_level(VOID) -{ - _tx_initialize_unused_memory = NULL; - _tx_thread_interrupt_control(0); -} - -VOID _tx_thread_exit(VOID) -{ - while (1) { - __asm__ volatile("wfi"); - } -} - -VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) -{ - int i; - uint8_t *stk; - tx_stack_frame_t *frame; - - stk = thread_ptr -> tx_thread_stack_end; - stk = (uint8_t *)(((unsigned long)stk) & (~(unsigned long)(sizeof(ALIGN_TYPE) - 1))); - stk -= sizeof(tx_stack_frame_t); - - frame = (tx_stack_frame_t *)stk; - - for (i = 0; i < sizeof(tx_stack_frame_t) / sizeof(unsigned long); i++) { - ((unsigned long*)frame)[i] = 0; - } - - frame->epc = (unsigned long)function_ptr; - frame->ra = (unsigned long)_tx_thread_exit; - frame->mstatus = (3UL << 11) | (1UL << 7); // mstatus.MPP=3, MPIE=1 - -#if __riscv_flen - frame->mstatus |= (1UL << 13); // mstatus.FS=1 - stk -= sizeof(tx_stack_f_frame_t); - tx_stack_f_frame_t *f_frame = (tx_stack_f_frame_t *)stk; - f_frame->fcsr = 0; - for (int i = 0; i < 32; i++) { - f_frame->f[i] = 0; - } -#endif - -#if __riscv_dsp - stk -= sizeof(tx_stack_p_frame_t); - tx_stack_p_frame_t *p_frame = (tx_stack_p_frame_t *)stk; - p_frame->vxsat = 0; -#endif - - thread_ptr -> tx_thread_stack_ptr = stk; -} - diff --git a/ports/xuantie/e906/gnu/src/tx_thread_context.S b/ports/xuantie/e906/gnu/src/tx_thread_context.S deleted file mode 100644 index 220520bb..00000000 --- a/ports/xuantie/e906/gnu/src/tx_thread_context.S +++ /dev/null @@ -1,283 +0,0 @@ - /* - * Copyright (C) 2017-2024 Alibaba Group Holding Limited - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -.section .text - - .align 3 - .global tspend_handler - .type tspend_handler, @function -tspend_handler: - addi sp, sp, -(30 * 4) - sw x1, 1 * 4(sp) /* RA */ - sw x5, 2 * 4(sp) - sw x6, 3 * 4(sp) - sw x7, 4 * 4(sp) - sw x8, 5 * 4(sp) - sw x9, 6 * 4(sp) - sw x10, 7 * 4(sp) - sw x11, 8 * 4(sp) - sw x12, 9 * 4(sp) - sw x13, 10 * 4(sp) - sw x14, 11 * 4(sp) - sw x15, 12 * 4(sp) - sw x16, 13 * 4(sp) - sw x17, 14 * 4(sp) - sw x18, 15 * 4(sp) - sw x19, 16 * 4(sp) - sw x20, 17 * 4(sp) - sw x21, 18 * 4(sp) - sw x22, 19 * 4(sp) - sw x23, 20 * 4(sp) - sw x24, 21 * 4(sp) - sw x25, 22 * 4(sp) - sw x26, 23 * 4(sp) - sw x27, 24 * 4(sp) - sw x28, 25 * 4(sp) - sw x29, 26 * 4(sp) - sw x30, 27 * 4(sp) - sw x31, 28 * 4(sp) - - csrr t0, mepc - sw t0, 0(sp) - - csrr t3, mstatus - sw t3, 29 * 4(sp) - -#if __riscv_flen - addi sp, sp, -4 - frcsr t0 - sw t0, 0(sp) -#if __riscv_float_abi_single - addi sp, sp, -(32 * 4) - fsw f0, 0 * 4(sp) - fsw f1, 1 * 4(sp) - fsw f2, 2 * 4(sp) - fsw f3, 3 * 4(sp) - fsw f4, 4 * 4(sp) - fsw f5, 5 * 4(sp) - fsw f6, 6 * 4(sp) - fsw f7, 7 * 4(sp) - fsw f8, 8 * 4(sp) - fsw f9, 9 * 4(sp) - fsw f10, 10 * 4(sp) - fsw f11, 11 * 4(sp) - fsw f12, 12 * 4(sp) - fsw f13, 13 * 4(sp) - fsw f14, 14 * 4(sp) - fsw f15, 15 * 4(sp) - fsw f16, 16 * 4(sp) - fsw f17, 17 * 4(sp) - fsw f18, 18 * 4(sp) - fsw f19, 19 * 4(sp) - fsw f20, 20 * 4(sp) - fsw f21, 21 * 4(sp) - fsw f22, 22 * 4(sp) - fsw f23, 23 * 4(sp) - fsw f24, 24 * 4(sp) - fsw f25, 25 * 4(sp) - fsw f26, 26 * 4(sp) - fsw f27, 27 * 4(sp) - fsw f28, 28 * 4(sp) - fsw f29, 29 * 4(sp) - fsw f30, 30 * 4(sp) - fsw f31, 31 * 4(sp) -#elif __riscv_float_abi_double - addi sp, sp, -(32 * 8) - fsw f0, 0 * 8(sp) - fsw f1, 1 * 8(sp) - fsw f2, 2 * 8(sp) - fsw f3, 3 * 8(sp) - fsw f4, 4 * 8(sp) - fsw f5, 5 * 8(sp) - fsw f6, 6 * 8(sp) - fsw f7, 7 * 8(sp) - fsw f8, 8 * 8(sp) - fsw f9, 9 * 8(sp) - fsw f10, 10 * 8(sp) - fsw f11, 11 * 8(sp) - fsw f12, 12 * 8(sp) - fsw f13, 13 * 8(sp) - fsw f14, 14 * 8(sp) - fsw f15, 15 * 8(sp) - fsw f16, 16 * 8(sp) - fsw f17, 17 * 8(sp) - fsw f18, 18 * 8(sp) - fsw f19, 19 * 8(sp) - fsw f20, 20 * 8(sp) - fsw f21, 21 * 8(sp) - fsw f22, 22 * 8(sp) - fsw f23, 23 * 8(sp) - fsw f24, 24 * 8(sp) - fsw f25, 25 * 8(sp) - fsw f26, 26 * 8(sp) - fsw f27, 27 * 8(sp) - fsw f28, 28 * 8(sp) - fsw f29, 29 * 8(sp) - fsw f30, 30 * 8(sp) - fsw f31, 31 * 8(sp) -#endif -#endif /* __riscv_flen */ - -#if __riscv_dsp - addi sp, sp, -4 - csrr t0, vxsat - sw t0, 0(sp) -#endif /*__riscv_dsp */ - - /* If _tx_thread_current_ptr is null, no sp need to be saved */ - la t0, _tx_thread_current_ptr - lw t0, 0(t0) - beqz t0, _tx_thread_switch - /* Store sp to task stack to _tx_thread_current_ptr -> tx_thread_stack_ptr */ - sw sp, 2 * 4(t0) - -_tx_thread_switch: - jal thread_switch_ext - /*clear software interrupt*/ - /* Edge-triggered vector interrupts do not require software to clear the pending bit. */ - - /* Switch task context to _tx_thread_execute_ptr */ - la t0, _tx_thread_execute_ptr - lw t0, 0(t0) - lw sp, 2 * 4(t0) - - /* Pop additional registers */ -#if __riscv_dsp - lw t0, 0(sp) - csrw vxsat, t0 - addi sp, sp, 4 -#endif /*__riscv_dsp */ - -#if __riscv_flen -#if __riscv_float_abi_single - flw f0, 0 * 4(sp) - flw f1, 1 * 4(sp) - flw f2, 2 * 4(sp) - flw f3, 3 * 4(sp) - flw f4, 4 * 4(sp) - flw f5, 5 * 4(sp) - flw f6, 6 * 4(sp) - flw f7, 7 * 4(sp) - flw f8, 8 * 4(sp) - flw f9, 9 * 4(sp) - flw f10, 10 * 4(sp) - flw f11, 11 * 4(sp) - flw f12, 12 * 4(sp) - flw f13, 13 * 4(sp) - flw f14, 14 * 4(sp) - flw f15, 15 * 4(sp) - flw f16, 16 * 4(sp) - flw f17, 17 * 4(sp) - flw f18, 18 * 4(sp) - flw f19, 19 * 4(sp) - flw f20, 20 * 4(sp) - flw f21, 21 * 4(sp) - flw f22, 22 * 4(sp) - flw f23, 23 * 4(sp) - flw f24, 24 * 4(sp) - flw f25, 25 * 4(sp) - flw f26, 26 * 4(sp) - flw f27, 27 * 4(sp) - flw f28, 28 * 4(sp) - flw f29, 29 * 4(sp) - flw f30, 30 * 4(sp) - flw f31, 31 * 4(sp) - addi sp, sp, (32 * 4) -#elif __riscv_float_abi_double - flw f0, 0 * 8(sp) - flw f1, 1 * 8(sp) - flw f2, 2 * 8(sp) - flw f3, 3 * 8(sp) - flw f4, 4 * 8(sp) - flw f5, 5 * 8(sp) - flw f6, 6 * 8(sp) - flw f7, 7 * 8(sp) - flw f8, 8 * 8(sp) - flw f9, 9 * 8(sp) - flw f10, 10 * 8(sp) - flw f11, 11 * 8(sp) - flw f12, 12 * 8(sp) - flw f13, 13 * 8(sp) - flw f14, 14 * 8(sp) - flw f15, 15 * 8(sp) - flw f16, 16 * 8(sp) - flw f17, 17 * 8(sp) - flw f18, 18 * 8(sp) - flw f19, 19 * 8(sp) - flw f20, 20 * 8(sp) - flw f21, 21 * 8(sp) - flw f22, 22 * 8(sp) - flw f23, 23 * 8(sp) - flw f24, 24 * 8(sp) - flw f25, 25 * 8(sp) - flw f26, 26 * 8(sp) - flw f27, 27 * 8(sp) - flw f28, 28 * 8(sp) - flw f29, 29 * 8(sp) - flw f30, 30 * 8(sp) - flw f31, 31 * 8(sp) - addi sp, sp, (32 * 8) -#endif - - lw t0, 0(sp) - fscsr t0 - addi sp, sp, 4 -#endif /* __riscv_flen */ - - /* Pop PC from stack and set MEPC */ - lw t0, 0 * 4(sp) - csrw mepc, t0 - - /* Pop mstatus from stack and set it */ - lw t0, 29 * 4(sp) - csrw mstatus, t0 - - /* Interrupt still disable here */ - /* Restore Registers from Stack */ - lw x1, 1 * 4(sp) /* RA */ - lw x5, 2 * 4(sp) - lw x6, 3 * 4(sp) - lw x7, 4 * 4(sp) - lw x8, 5 * 4(sp) - lw x9, 6 * 4(sp) - lw x10, 7 * 4(sp) - lw x11, 8 * 4(sp) - lw x12, 9 * 4(sp) - lw x13, 10 * 4(sp) - lw x14, 11 * 4(sp) - lw x15, 12 * 4(sp) - lw x16, 13 * 4(sp) - lw x17, 14 * 4(sp) - lw x18, 15 * 4(sp) - lw x19, 16 * 4(sp) - lw x20, 17 * 4(sp) - lw x21, 18 * 4(sp) - lw x22, 19 * 4(sp) - lw x23, 20 * 4(sp) - lw x24, 21 * 4(sp) - lw x25, 22 * 4(sp) - lw x26, 23 * 4(sp) - lw x27, 24 * 4(sp) - lw x28, 25 * 4(sp) - lw x29, 26 * 4(sp) - lw x30, 27 * 4(sp) - lw x31, 28 * 4(sp) - addi sp, sp, (30 * 4) - - mret - - .size tspend_handler, . - tspend_handler diff --git a/ports/xuantie/e906/gnu/src/tx_thread_interrupt_control.S b/ports/xuantie/e906/gnu/src/tx_thread_interrupt_control.S deleted file mode 100644 index f5b538e8..00000000 --- a/ports/xuantie/e906/gnu/src/tx_thread_interrupt_control.S +++ /dev/null @@ -1,83 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2024 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the MIT License which is available at - * https://opensource.org/licenses/MIT. - * - * SPDX-License-Identifier: MIT - **************************************************************************/ - - -/**************************************************************************/ -/**************************************************************************/ -/** */ -/** ThreadX Component */ -/** */ -/** Thread */ -/** */ -/**************************************************************************/ -/**************************************************************************/ - - - .section .text -/**************************************************************************/ -/* */ -/* FUNCTION RELEASE */ -/* */ -/* _tx_thread_interrupt_control RISC-V64/GNU */ -/* 6.2.1 */ -/* AUTHOR */ -/* */ -/* Scott Larson, Microsoft Corporation */ -/* */ -/* DESCRIPTION */ -/* */ -/* This function is responsible for changing the interrupt lockout */ -/* posture of the system. */ -/* */ -/* INPUT */ -/* */ -/* new_posture New interrupt lockout posture */ -/* */ -/* OUTPUT */ -/* */ -/* old_posture Old interrupt lockout posture */ -/* */ -/* CALLS */ -/* */ -/* None */ -/* */ -/* CALLED BY */ -/* */ -/* Application Code */ -/* */ -/* RELEASE HISTORY */ -/* */ -/* DATE NAME DESCRIPTION */ -/* */ -/* 03-08-2023 Scott Larson Initial Version 6.2.1 */ -/* */ -/**************************************************************************/ -/* UINT _tx_thread_interrupt_control(UINT new_posture) -{ */ - .global _tx_thread_interrupt_control -_tx_thread_interrupt_control: - /* Pickup current interrupt lockout posture. */ - /* old_mstatus = mstatus; */ - - csrr t0, mstatus - mv t1, t0 // Save original mstatus for return - - /* Apply the new interrupt posture while preserving unrelated mstatus bits. */ - /* Only modify the MIE bit (bit 3) */ - /* mstatus = (mstatus & ~MIE) | (new_posture & MIE); */ - - li t2, ~0x08 // Build mask to clear MIE - and t0, t0, t2 // Clear MIE bit - and a0, a0, 0x08 // Mask incoming to only MIE bit - or t0, t0, a0 // Set requested MIE state - csrw mstatus, t0 - andi a0, t1, 0x08 // Return original MIE bit - ret -/* } */ diff --git a/ports/xuantie/e906/gnu/src/tx_thread_schedule.S b/ports/xuantie/e906/gnu/src/tx_thread_schedule.S deleted file mode 100644 index 09d67ec2..00000000 --- a/ports/xuantie/e906/gnu/src/tx_thread_schedule.S +++ /dev/null @@ -1,234 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2024 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the MIT License which is available at - * https://opensource.org/licenses/MIT. - * - * SPDX-License-Identifier: MIT - **************************************************************************/ - - -/**************************************************************************/ -/**************************************************************************/ -/** */ -/** ThreadX Component */ -/** */ -/** Thread */ -/** */ -/**************************************************************************/ -/**************************************************************************/ - - .section .text -/**************************************************************************/ -/* */ -/* FUNCTION RELEASE */ -/* */ -/* _tx_thread_schedule RISC-V64/GNU */ -/* 6.2.1 */ -/* AUTHOR */ -/* */ -/* Scott Larson, Microsoft Corporation */ -/* */ -/* DESCRIPTION */ -/* */ -/* This function waits for a thread control block pointer to appear in */ -/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ -/* in the variable, the corresponding thread is resumed. */ -/* */ -/* INPUT */ -/* */ -/* None */ -/* */ -/* OUTPUT */ -/* */ -/* None */ -/* */ -/* CALLS */ -/* */ -/* None */ -/* */ -/* CALLED BY */ -/* */ -/* _tx_initialize_kernel_enter ThreadX entry function */ -/* _tx_thread_system_return Return to system from thread */ -/* _tx_thread_context_restore Restore thread's context */ -/* */ -/* RELEASE HISTORY */ -/* */ -/* DATE NAME DESCRIPTION */ -/* */ -/* 03-08-2023 Scott Larson Initial Version 6.2.1 */ -/* */ -/**************************************************************************/ -/* VOID _tx_thread_schedule(VOID) -{ */ - .align 3 - .global _tx_thread_schedule - .type _tx_thread_schedule, @function -_tx_thread_schedule: - /* Enable interrupts. */ - csrsi mstatus, 0x08 // Enable interrupts - - /* Wait for a thread to execute. */ - /* do - { */ - la t0, _tx_thread_execute_ptr // Pickup address of execute ptr -_tx_thread_schedule_loop: - lw t1, 0(t0) // Pickup next thread to execute - beqz t1, _tx_thread_schedule_loop // If NULL, wait for thread to execute - /* } - while(_tx_thread_execute_ptr == TX_NULL); */ - - /* Yes! We have a thread to execute. Lockout interrupts and - transfer control to it. */ - csrci mstatus, 0x08 // Lockout interrupts - - /* Setup the current thread pointer. */ - /* _tx_thread_current_ptr = _tx_thread_execute_ptr; */ - la t0, _tx_thread_current_ptr // Pickup current thread pointer address - sw t1, 0(t0) // Set current thread pointer - - /* Increment the run count for this thread. */ - /* _tx_thread_current_ptr -> tx_thread_run_count++; */ - lw t2, 1 * 4(t1) // Pickup run count - lw t3, 6 * 4(t1) // Pickup time slice value - addi t2, t2, 1 // Increment run count - sw t2, 1 * 4(t1) // Store new run count - - /* Setup time-slice, if present. */ - /* _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; */ - la t2, _tx_timer_time_slice // Pickup time-slice variable address - - /* Switch to the thread's stack. */ - /* SP = _tx_thread_execute_ptr -> tx_thread_stack_ptr; */ - lw sp, 2 * 4(t1) // Switch to thread's stack - sw t3, 0(t2) // Store new time-slice*/ - -#if __riscv_dsp - lw t0, 0(sp) - csrw vxsat, t0 - addi sp, sp, 4 -#endif /*__riscv_dsp */ - -#if __riscv_flen -#if __riscv_float_abi_single - flw f0, 0 * 4(sp) - flw f1, 1 * 4(sp) - flw f2, 2 * 4(sp) - flw f3, 3 * 4(sp) - flw f4, 4 * 4(sp) - flw f5, 5 * 4(sp) - flw f6, 6 * 4(sp) - flw f7, 7 * 4(sp) - flw f8, 8 * 4(sp) - flw f9, 9 * 4(sp) - flw f10, 10 * 4(sp) - flw f11, 11 * 4(sp) - flw f12, 12 * 4(sp) - flw f13, 13 * 4(sp) - flw f14, 14 * 4(sp) - flw f15, 15 * 4(sp) - flw f16, 16 * 4(sp) - flw f17, 17 * 4(sp) - flw f18, 18 * 4(sp) - flw f19, 19 * 4(sp) - flw f20, 20 * 4(sp) - flw f21, 21 * 4(sp) - flw f22, 22 * 4(sp) - flw f23, 23 * 4(sp) - flw f24, 24 * 4(sp) - flw f25, 25 * 4(sp) - flw f26, 26 * 4(sp) - flw f27, 27 * 4(sp) - flw f28, 28 * 4(sp) - flw f29, 29 * 4(sp) - flw f30, 30 * 4(sp) - flw f31, 31 * 4(sp) - addi sp, sp, (32 * 4) -#elif __riscv_float_abi_double - flw f0, 0 * 8(sp) - flw f1, 1 * 8(sp) - flw f2, 2 * 8(sp) - flw f3, 3 * 8(sp) - flw f4, 4 * 8(sp) - flw f5, 5 * 8(sp) - flw f6, 6 * 8(sp) - flw f7, 7 * 8(sp) - flw f8, 8 * 8(sp) - flw f9, 9 * 8(sp) - flw f10, 10 * 8(sp) - flw f11, 11 * 8(sp) - flw f12, 12 * 8(sp) - flw f13, 13 * 8(sp) - flw f14, 14 * 8(sp) - flw f15, 15 * 8(sp) - flw f16, 16 * 8(sp) - flw f17, 17 * 8(sp) - flw f18, 18 * 8(sp) - flw f19, 19 * 8(sp) - flw f20, 20 * 8(sp) - flw f21, 21 * 8(sp) - flw f22, 22 * 8(sp) - flw f23, 23 * 8(sp) - flw f24, 24 * 8(sp) - flw f25, 25 * 8(sp) - flw f26, 26 * 8(sp) - flw f27, 27 * 8(sp) - flw f28, 28 * 8(sp) - flw f29, 29 * 8(sp) - flw f30, 30 * 8(sp) - flw f31, 31 * 8(sp) - addi sp, sp, (32 * 8) -#endif - - lw t0, 0(sp) - fscsr t0 - addi sp, sp, 4 -#endif /* __riscv_flen */ - - /* Pop PC from stack and set MEPC */ - lw t0, 0 * 4(sp) - csrw mepc, t0 - - /* Pop mstatus from stack and set it */ - lw t0, 29 * 4(sp) - csrw mstatus, t0 - - /* Interrupt still disable here */ - /* Restore Registers from Stack */ - lw x1, 1 * 4(sp) /* RA */ - lw x5, 2 * 4(sp) - lw x6, 3 * 4(sp) - lw x7, 4 * 4(sp) - lw x8, 5 * 4(sp) - lw x9, 6 * 4(sp) - lw x10, 7 * 4(sp) - lw x11, 8 * 4(sp) - lw x12, 9 * 4(sp) - lw x13, 10 * 4(sp) - lw x14, 11 * 4(sp) - lw x15, 12 * 4(sp) - lw x16, 13 * 4(sp) - lw x17, 14 * 4(sp) - lw x18, 15 * 4(sp) - lw x19, 16 * 4(sp) - lw x20, 17 * 4(sp) - lw x21, 18 * 4(sp) - lw x22, 19 * 4(sp) - lw x23, 20 * 4(sp) - lw x24, 21 * 4(sp) - lw x25, 22 * 4(sp) - lw x26, 23 * 4(sp) - lw x27, 24 * 4(sp) - lw x28, 25 * 4(sp) - lw x29, 26 * 4(sp) - lw x30, 27 * 4(sp) - lw x31, 28 * 4(sp) - addi sp, sp, (30 * 4) - - mret - - .size _tx_thread_schedule, . - _tx_thread_schedule - -/* } */ diff --git a/ports/xuantie/e906/gnu/src/tx_thread_system_return.S b/ports/xuantie/e906/gnu/src/tx_thread_system_return.S deleted file mode 100644 index 598bc283..00000000 --- a/ports/xuantie/e906/gnu/src/tx_thread_system_return.S +++ /dev/null @@ -1,78 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2024 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the MIT License which is available at - * https://opensource.org/licenses/MIT. - * - * SPDX-License-Identifier: MIT - **************************************************************************/ - - -/**************************************************************************/ -/**************************************************************************/ -/** */ -/** ThreadX Component */ -/** */ -/** Thread */ -/** */ -/**************************************************************************/ -/**************************************************************************/ - .section .text -/**************************************************************************/ -/* */ -/* FUNCTION RELEASE */ -/* */ -/* _tx_thread_system_return RISC-V64/GNU */ -/* 6.2.1 */ -/* AUTHOR */ -/* */ -/* Scott Larson, Microsoft Corporation */ -/* */ -/* DESCRIPTION */ -/* */ -/* This function is target processor specific. It is used to transfer */ -/* control from a thread back to the system. Only a minimal context */ -/* is saved since the compiler assumes temp registers are going to get */ -/* slicked by a function call anyway. */ -/* */ -/* INPUT */ -/* */ -/* None */ -/* */ -/* OUTPUT */ -/* */ -/* None */ -/* */ -/* CALLS */ -/* */ -/* _tx_thread_schedule Thread scheduling loop */ -/* */ -/* CALLED BY */ -/* */ -/* ThreadX components */ -/* */ -/* RELEASE HISTORY */ -/* */ -/* DATE NAME DESCRIPTION */ -/* */ -/* 03-08-2023 Scott Larson Initial Version 6.2.1 */ -/* */ -/**************************************************************************/ -/* VOID _tx_thread_system_return(VOID) -{ */ - .align 3 - .global _tx_thread_system_return - .type _tx_thread_system_return, @function -_tx_thread_system_return: - li t0, 0xE080100C - lb t1, (t0) - li t2, 0x01 - or t1, t1, t2 - sb t1, (t0) - - fence - ret - .size _tx_thread_system_return, . - _tx_thread_system_return - -/* } */ diff --git a/ports/xuantie/e906/gnu/src/tx_timer_interrupt.c b/ports/xuantie/e906/gnu/src/tx_timer_interrupt.c deleted file mode 100644 index aea1119b..00000000 --- a/ports/xuantie/e906/gnu/src/tx_timer_interrupt.c +++ /dev/null @@ -1,125 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2024 Microsoft Corporation - * - * This program and the accompanying materials are made available under the - * terms of the MIT License which is available at - * https://opensource.org/licenses/MIT. - * - * SPDX-License-Identifier: MIT - **************************************************************************/ - - -/**************************************************************************/ -/**************************************************************************/ -/** */ -/** ThreadX Component */ -/** */ -/** Timer */ -/** */ -/**************************************************************************/ -/**************************************************************************/ - -#define TX_SOURCE_CODE - -/* Include necessary system files. */ - -#include "tx_api.h" -#include "tx_timer.h" -#include "tx_thread.h" - -/**************************************************************************/ -/* */ -/* FUNCTION RELEASE */ -/* */ -/* _tx_timer_interrupt RISC-V64/GNU */ -/* 6.2.1 */ -/* AUTHOR */ -/* */ -/* Scott Larson, Microsoft Corporation */ -/* */ -/* DESCRIPTION */ -/* */ -/* This function processes the hardware timer interrupt. This */ -/* processing includes incrementing the system clock and checking for */ -/* time slice and/or timer expiration. If either is found, the */ -/* interrupt context save/restore functions are called along with the */ -/* expiration functions. */ -/* */ -/* INPUT */ -/* */ -/* None */ -/* */ -/* OUTPUT */ -/* */ -/* None */ -/* */ -/* CALLS */ -/* */ -/* _tx_timer_expiration_process Timer expiration processing */ -/* _tx_thread_time_slice Time slice interrupted thread */ -/* */ -/* CALLED BY */ -/* */ -/* interrupt vector */ -/* */ -/* RELEASE HISTORY */ -/* */ -/* DATE NAME DESCRIPTION */ -/* */ -/* 03-08-2023 Scott Larson Initial Version 6.2.1 */ -/* */ -/**************************************************************************/ -VOID _tx_timer_interrupt(VOID) -{ - /* Increment system clock. */ - _tx_timer_system_clock++; - - /* Test for time-slice expiration. */ - if (_tx_timer_time_slice) - { - /* Decrement the time_slice. */ - _tx_timer_time_slice--; - /* Check for expiration. */ - if (_tx_timer_time_slice == 0) - { - /* Set the time-slice expired flag. */ - _tx_timer_expired_time_slice = TX_TRUE; - } - } - - /* Test for timer expiration. */ - if (*_tx_timer_current_ptr) - { - /* Set expiration flag. */ - _tx_timer_expired = TX_TRUE; - } - else - { - /* No timer expired, increment the timer pointer. */ - _tx_timer_current_ptr++; - /* Check for wrap-around. */ - if (_tx_timer_current_ptr == _tx_timer_list_end) - { - /* Wrap to beginning of list. */ - _tx_timer_current_ptr = _tx_timer_list_start; - } - } - - /* See if anything has expired. */ - if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) - { - /* Did a timer expire? */ - if (_tx_timer_expired) - { - /* Process timer expiration. */ - _tx_timer_expiration_process(); - } - - /* Did time slice expire? */ - if (_tx_timer_expired_time_slice) - { - /* Time slice interrupted thread. */ - _tx_thread_time_slice(); - } - } -} |
